perm filename LISP.RPG[S,DOC]13 blob sn#684692 filedate 1982-09-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00345 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00023 00002				       Table of Contents
C00027 00003
C00031 00004
C00037 00005
C00039 00006				     Part 1 - The Language
C00043 00007				   Maclisp Reference Manual
C00046 00008				      General Information
C00050 00009				   Maclisp Reference Manual
C00053 00010				      General Information
C00056 00011				   Maclisp Reference Manual
C00057 00012					 Data Objects
C00061 00013				   Maclisp Reference Manual
C00066 00014					 Data Objects
C00071 00015				   Maclisp Reference Manual
C00074 00016					 Data Objects
C00076 00017				   Maclisp Reference Manual
C00077 00018				   The Basic Actions of LISP
C00081 00019				   Maclisp Reference Manual
C00084 00020				   The Basic Actions of LISP
C00089 00021				   Maclisp Reference Manual
C00092 00022				   The Basic Actions of LISP
C00096 00023				   Maclisp Reference Manual
C00100 00024				   The Basic Actions of LISP
C00104 00025				   Maclisp Reference Manual
C00107 00026				   The Basic Actions of LISP
C00111 00027				   Maclisp Reference Manual
C00114 00028				   The Basic Actions of LISP
C00116 00029				   Maclisp Reference Manual
C00119 00030				Part 2 - Function Descriptions
C00122 00031				   Maclisp Reference Manual
C00125 00032					  Predicates
C00128 00033				   Maclisp Reference Manual
C00131 00034					  Predicates
C00132 00035				   Maclisp Reference Manual
C00133 00036					 The Evaluator
C00136 00037				   Maclisp Reference Manual
C00139 00038					 The Evaluator
C00142 00039				   Maclisp Reference Manual
C00145 00040					 The Evaluator
C00149 00041				   Maclisp Reference Manual
C00152 00042					 The Evaluator
C00155 00043				   Maclisp Reference Manual
C00157 00044				  Manipulating List Structure
C00160 00045				   Maclisp Reference Manual
C00163 00046				  Manipulating List Structure
C00164 00047				   Maclisp Reference Manual
C00166 00048				  Manipulating List Structure
C00168 00049				   Maclisp Reference Manual
C00171 00050				  Manipulating List Structure
C00174 00051				   Maclisp Reference Manual
C00175 00052				  Manipulating List Structure
C00177 00053				   Maclisp Reference Manual
C00181 00054				  Manipulating List Structure
C00185 00055				   Maclisp Reference Manual
C00187 00056				  Manipulating List Structure
C00190 00057				   Maclisp Reference Manual
C00193 00058				  Manipulating List Structure
C00196 00059				   Maclisp Reference Manual
C00198 00060				  Manipulating List Structure
C00202 00061				   Maclisp Reference Manual
C00204 00062				  Manipulating List Structure
C00208 00063				   Maclisp Reference Manual
C00211 00064					Flow of Control
C00215 00065				   Maclisp Reference Manual
C00218 00066					Flow of Control
C00221 00067				   Maclisp Reference Manual
C00225 00068					Flow of Control
C00228 00069				   Maclisp Reference Manual
C00233 00070					Flow of Control
C00236 00071				   Maclisp Reference Manual
C00239 00072					Flow of Contrcl
C00241 00073				   Maclisp Reference Manual
C00244 00074					Flow of Control
C00245 00075				   Maclisp Reference Manual
C00249 00076					Flow of Control
C00252 00077				   Maclisp Reference Manual
αC00253 0007`∩∩∩∩%βi←[%FA's5E←Yf4∃ε``Hjn@`@`nr∩$∩∩@@↓≠CGY%c`A%∃MKeK9GJA≠¬]kCX4∃ε``Hjr@`@`p`∩$∩∩∪βQ←[SF↓'s[E=Yf~∃``dl@@``βAD$∧HI↓↓αn∂3'∨↓αK↔4+K↔;≡)α7πw+π04T→AAI3!↓AAβAH$$HH&πS}k'
α∨K7?g_4*
β↓IY]β↓AAa_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓I]Aβ↓AAa H$$$LS?7N→αOGn∪?3LhR
AA∪9I↓Aβ↓aT$HH%↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ0hR
AA∪9U↓Aβ↓aX$HH$&π&{7'
¬≠g7}cL4*≠↓AI]:↓AAAC8$$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04*≠↓AIa
↓AAAC@$$$HJπS?nK
αONk?3_h*
Aβ⊃aU↓β↓AadHH$%↓αα7π∂fKOAα⊗+≠↔K.s∂∃αn;Wπ`h*
Aβ⊃aY↓β↓Ae@HH$$&∂#?7'~αOg7⊗{3L4T→AAICI↓AAβID$$HI↓↓αn∂3'∨↓αK↔6+K↔;≡)α7πw+π04T→AAIK⊃↓AAβIH$$HH&πS}k'
α∨K7?g_4*
β↓IeQβ↓AAe_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓IeUβ↓AAe H$$$J↓↓↓αw+7↔↔_4*
β↓Ie]β↓AAe(H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓Ieeβ↓AAe0H$$$J↓↓↓αw+7↔↔_4*
β↓MAEβ↓AAe8H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MAMβ↓AAe@H$$$J↓↓↓αw+7↔↔_4*
β↓MAUβ↓AAeHH$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MA]β↓AEAH$$$J↓↓↓αw+7↔↔_4*
β↓MEAβ↓AEAλH$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MEMβ↓AEA⊂H$$$J↓↓↓αw+7↔↔_4*
β↓MEQβ↓AEA_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓ME]β↓AEA H$$$J↓↓↓αw+7↔↔_4*
β↓MIAβ↓AEA(@$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MIEβ↓AEA0H$$$J↓↓↓αw+7↔↔_4*
β↓MIQβ↓AEA8H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*β↓MIYβ↓AEA@H$$$J↓↓↓αw+7↔↔_4*
β↓MIaβ↓AEAH@$$¬α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MIeβ↓AEEH$$$J↓↓↓αw+7↔↔_4*
β↓MMIβ↓AEEλH$$¬α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*β↓MMQβ↓AEE⊂H$$∧J↓↓↓αw+7↔↔_4*
β↓MM]β↓AEE_H$$%α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4*
β↓MMeβ↓AEE H$$¬α↓↓α∂FKπ∂&+Iα7∞s'CWfS'?ph*
Aβ→QE↓β↓EETHH$%↓αα7π∂fKOAα⊗+≠↔K.s∂∃αn;Wπ`h*
Aβ→QQ↓β↓EEXHH$%↓α↓α∂#∂∪π∂S/⊃α7πvKCW∪∂#'?8hR
AA≠!]↓Aβ	EL$HH%↓↓∧kπ∂3O≠AαK.3↔K↔v≠∃α7∞sWπ0hR
AA≠!a↓Aβ	E@$HH%↓↓αα∂βπ⊗∂S↔∩α7π;Hεπ.f≡M⊗}pQ(3ββ6V∩ββε⊂'⊃ ""$∧λ∪8,=~<|∧
Y9P∩\2w1bH&pw:XvεE!L_→BYH__⊂@20					    Arrays
C00357 0012⊃		↓	   Eaclisp Reference Manual
αC00362``bdβ⊂$$∧HI↓↓↓∧KKπM_4*β↓MY]β↓AEI_H$$∧α↓α7π≡c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4
αεβ≠≠∧εββ&A⊂HHα"(∧∧λ⊂<N>8c!(lλfvhε⊗M""↓⊃(λλ	\8{~.x⊂)2Y2y2g_pP&p[:pvεB!X⊂→M[⊂⊂_Y≠∧DαD@	    Arrays
A00380 0127				   MacliSp ReFerence @≠↓∞sWπ⊂hR≠βε7β
α∧&'α""!∀λλλ∧∧λ∪8.∞~;Ydλ]3XnM9{TaQP`λ_X~P__Y≤DBD@	  MacLisp Re`
Ke∃]GJA5C]kC0~¬εβ↓Maaβ↓AEM@⊂HHα(λ∧∧λλλ	\<≤⊂∀[3P#*[1z4g[9FE!L_⊃@→1 00"β→D∧⊃⊃ααα	\⊗≡f≡:α¬⊗\h	.2p∞c↓⊂A≠C]UCX~∃``f↓K⊃↓A@ε⊂f! ""∧∧λλλ∧
_0	:λ→P⊗@ The SysteM
C`@frh@@`bf_@⊂Hλα ⊂⊂λ&pqf~yx⊂)→pεerence Manual
∃ε↓β↓Me]β↓AEMαA⊂HHα"(∧
~→(
?<⎇→-Q ¬!X~_1``BfT∩αα∩@Aβ
YSg`↓%KMJIK]GJ↓≠CMk¬X∩*≠↓AQ@~↓AA¬≠0$$∧HI↓αSF)αOG∨#↔44T→AA⊃β9↓AAλε3(Hα""∧∧λ∪8,=~<|∧
Y9@∩\αenC∀A≠C]UCX~∃``H`d@``↓λε3@H⊃⊃Jα
Mε*¬?~7&.β#"HX_α01   Dfr$HH%↓↓∧kπ∂3M≠AαK,3↔K↔v≠∃αXλ;N\9β"HX_α14 0 140				↓  The @&βKOS⊗hh ∀≠εC↓λλε⊗α⊂⊃	λ	↓   Macl@%`∂Aα⊗+⊂⊗/,Yf≡
	\⊗w.≥AP@(lλ
ε&H__X∧"	λ		∩↓)QJAMsgiK4~¬εβ↓QIYβ↓AEQ_H$$⊂λλ∧	88p⊗~yx⊂)→q2y2[1rP&Xw:`vα@
C`@hd@$∧εββFA⊂Hλα"(∧
~→(
?<⎇→-Q ¬!X~→@2``Bhβ($∧⊃∀αα∧β08mM<|λ
,9Y →→u1rP∪pp∞uAlλ
*≠↓AQLε@λεελ-≠α@@		λ∧@A)Q∀A'@&ε:F.hβ"Pfε	n∧ελ_@40ε$⊃⊃$∧λ∪8,=~0	xλ)2cep¬K@:_B∧n≥jV∞`Q(#βαF@Dελ_@48	∩∩ λ%↓ααMε*∧?_nL8εFE⊂β0 hβ!@:α∧λ_
≤@		λ∧∩@@A5CGIRβ≠Aα,∧f/⊗]h6*∧β0⊂w≥pp
@ε`@↓ εS
α∧λ_MX∧DDα@	  The @&πK@∨εX#!!P0450λ@β↓E@+⊃⊃!⊂∧P⊂⊂∪pqf(pπ`A⊗#⊂⊗.,XL≤αP&`[8¬al
λ¬ε@↓β!UEεεβ,B"B@	∩↓ααS#∃¬≠gOS,¬Ph∀0εFLhεε- →D↓	↓∩↓7				   Maclisp Reference Manual
C00482 00158					  The System
C00484 00159				   Maclisp Reference Manual
C00488 00160					  The System
C00492 00161				   Maclisp Reference Manual
C00496 00162					  The System
C00500 00163				   Maclisp Reference Manual
C00504 00164					  The System
C00507 00165				   Maclisp Reference Manual
C00509 00166					  The System
C00512 00167				   Maclisp Reference Manual
C00516 00168					  The System
C00519 00169				   Maclisp Reference Manual
C00522 00170					  The System
C00524 00171				   Maclisp Reference Manual
C00527 00172					  The System
C00530 00173				   Maclisp Reference Manual
C00534 00174					  The System
C00538 00175				   Maclisp Reference Manual
C00543 00176					  The System
C00548 00177				   Maclisp Reference Manual
C00552 00178					  The System
C00556 00179				   Maclisp Reference Manual
C00561 00180					  The System
C00565 00181				   Maclisp Reference Manual
C00569 00182					  The System
C00572 00183				   Maclisp Reference Manual
C00577 00184					  The System
C00582 00185				   Maclisp Reference Manual
C00586 00186					  The System
C00591 00187				   Maclisp Reference Manual
C00595 00188					  The System
C00597 00189				   Maclisp Reference Manual
C00600 00190					  The System
C00602 00191				   Maclisp Reference Manual
C00606 00192					  The System
C00610 00193				   Maclisp Reference Manual
C00612 00194					  The System
C00616 00195				   Maclisp Reference Manual
C00621 00196					  The System
C00625 00197				   Maclisp Reference Manual
C00630 00198					  The System
C00634 00199				   Maclisp Reference Manual
C00635 00200					  The System
C00639 00201				   Maclisp Reference Manual
C00643 00202					  The System
C00647 00203				   Maclisp Reference Manual
C00650 00204					  The System
C00654 00205				   Maclisp Reference Manual
C00657 00206					  The System
C00661 00207				   Maclisp Reference Manual
C00665 00208					  The System
C00670 00209				   Maclisp Reference Manual
C00673 00210					  The System
C00676 00211				   Maclisp Reference Manual
C00681 00212					  The System
C00685 00213				   Maclisp Reference Manual
C00689 00214					  The System
C00693 00215				   Maclisp Reference Manual
C00697 00216					  The System
C00701 00217				   Maclisp Reference Manual
C00704 00218					  The System
C00707 00219				   Maclisp Reference Manual
C00711 00220					  The System
C00715 00221				   Maclisp Reference Manual
C00718 00222					  The System
C00721 00223				   Maclisp Reference Manual
C00725 00224					  The System
C00729 00225				   Maclisp Reference Manual
C00733 00226					  The System
C00736 00227				   Maclisp Reference Manual
C00739 00228					  The System
C00743 00229				   Maclisp Reference Eanual
C00745 00230					  The System
C00750 00231				   Maclisp Reference Manual
C00753 00232					  The System
C00756 00233λ		↓   Maclisp Reference Manual
C 0751 00234					  The System
αC0076200235				   Maclisp Reference Manual
∃ε@`nll``dfX∩∩∩∩$@A)Q∀A'sgQKZ~∃``nl`@``∧Ln∩α∩%!Cehh@ZAQQJA→%' Aπ=[aSY∃`λ4
≠↓A]]∩↓AAI≠@$$∧J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(6ββ;vdβββ&7⊂hT4εβ;C∧εββ∪F↓⊂HH∀∧α∧n≤=FO∨∧
&.6↑,Vv≡T	V∞w\≥@h∀4εβ+C$εββ∪F⊃PT≠∧εsC:εεβ∪#!⊃⊂HJ∧∧∧n∞=M↔∂α
,V6/,Yf≡
	\⊗w.≥APT≠∧εsK
∧εβ∪#1Q$≠βεs∪"βεε## ⊃⊃⊂Jα∧	V∞≡M≡7α¬,Xf/⊗]l6*∧β8;N\;β"H6
`≤NP_⊂→
~FE!L_≤__λ__"Ph∩∩∩$@@A≠¬GYSg@A%KMα+@⊗.l8R∧n≥nV∞`Q(3ββεε"ββ∧"C(H⊃⊃⊂J∧L\6f∂,≡FN}n1PT≠επββ2εεβ∪#↓⊃HJ∧∧∧n∞=I↔∨α
,V6/,]f≡*	\⊗w.≥APT≠επβαεεβ∪#⊃⊃⊂HH∀λF.≡L≡&∂&≥⎇g_h(6ββC⊗4βββ&VHH⊃∀αα∧\≤6fO>∧¬⊗.lZ&.v<T∧n∞n\⊗`h(6ββC⊗pβββ&V⊂HH⊃⊃∩∧&\9F∂⊗≡M⊗}w1Q$≠βπα#
βεε#+⊂⊃⊃⊂Jα∧	V∞≡M≡7α¬,\f/⊗]l6*∧\≥g.∞AQ$≠βπα#∩βεε#+_⊃⊃⊂Jα
.Vvv≥lr∧≡⎇↑εNf\@λλn;Xu
≥{\c!(l∞ε&(ε&-α"!⊃(λλ	\8{∩.x⊂)2Y2y2w_rP&p[:pvεB!X_≤≤⊂__~ZDDαDP⊂⊂λ⊂):`.nifg↓iQJA
←[aSαc↔HQ(3ββ∧6∩ββ∧"S0H⊃⊃∩αα	\⊗≡f≡>α¬⊗\`	.;Xq$	8;],≥β"Pfε∞m∧εE&q ∧DDH⊂⊂⊂⊂∀:s74[3P:4→P!w`-pileR	
C0838 00258			↓   MacLisp Reference Manual
αC 0843 00259λ		∩@@A%U]US]≤AaQJ↓β←[a%QKd~)α``pβ!U↓Aαε#&α""!∀λλ∪,≤{~4n∧∀Y1L↑Y;XlT⊂ε`w≥prεE⊂X_∀40∧@`@Hhb$HH&S#*α3'OααπOO,¬V⊗g∀
πε↑|,⊗jB	H∃hαPlεπ
(λεεMLA⊃ ∧DPλ⊂"pq[4yx⊂∀2s2i→w1rP∪pw:p[∧@
C0085$``DlL∩∩∩∪QQJA→%`∂Aα∂≠G↔\-GJ¬∞-v/⊗≥QB∧d~↓PD≠επβ+Jεβ∪3A⊃⊂HJ∧∧∧n∞=I↔∂α
,V&/,]f≡*	\⊗w.≥APD≠∧πβ#∩ε&M""↓⊃5~→$	~<t∧λ<|q-\Y~(
∞Yy|L≥+λ∪λ~β"Pfε∞
MDεEFa ""$∧λ∪8,=~<|∧
Y9P∩\αenc↓∀A≠C]UCX~∃``pN@@``⊃1\$⊃⊃∃&FT	FO∨∧λ↔∂≡]\&gJλM||X;%D⊃⊂ (βE!@⊂0874 0026 0$∩∩$α↓α7π≤c'OA¬∪↔≠↔⊗+;∂∃∧kπ;W∞`4
αεβC;tεββ∪e⊃!⊂ ∧j4→P"4`3p Ac@MK[EYβIαCK|;@⊗∞β+λ	H4β"HX_∧80 0 Hh
@$HH%↓↓∧kπ∂3Lε7α¬,X	L↑Y;XlT⊂ε`w≥prεE⊂β00(`f@`↓β⊃@≠λα""↓~~→(	M<|λλ≡|q0⊗X68@(≤0πg@e¬ZP⊃αd
@$(6ββC∧pβββ&pA⊂ ∧DPλ⊂ 
aclisp RefeIKUGJ↓≠CMk¬X⊂∀(6ββC⊗∧βββ&pa⊃ ∧Dj~2P& (pπ`AβMcK@7⊗ceαβ⊗{⊂∨⊗≥P∧	⊂4β!λlλλ≤∞X⊂⊂_≠R∧Dα@P⊂⊂∪pqv )pπ`A%⊃H↔K,s∂¬αn;Gπ`h"
AβAeM↓β↓I]TH@$&SF)α3'∨↓απO≤+7∪JαCK∨?∪π51∧bε@4T→AAeβ↓↓A@ε 
@Mα	∩∩ 	↓↓αn∂3'≥↓αK↔0∧W,9P`∩H&pw:XvεE!L_≤X→H__∩Xh$⊃⊃∃&FT	FO∨∧λ↔∂≡]\&gJλM||X;%D⊃⊂ (βE!@00907 00278		↓∩A≠CGαc'OA¬∪↔6↑,Vv≡T	V∞w\≥@h∀0π⊗∞(εεMn"!⊂(λ⊂l≥≠~3LT⊂≤[l@y0viH+y4`4p	KL@αK9α|Mε/∩	H⊗v?\≤v/_Q(3ββ⊗⊗2ββ∧@≤∧@DDλ⊂⊂&pXv4qxλ)2s %p¬KMεε)α7πw+π04T→AAeA↓A@ε ∞ε⊂ ∧DPλ!pv ,ing Pp`∂O⊗7Mα?∪'SS,qβ'→∧{S#↔⊂∧∧f∞βP∪zXqryFB!X⊂922 `@dpd∩ λ$%↓αα7π∂dK@∨α
,V&/,Yf≡
	\⊗w∞≥APT≠∧∞&&(λε'b"!∀λ⊂p-M~;Yd
≤[qn8εyP∃βr`∪IQK\ARαqα?SF+Aα∪∞s∨Wπ>+D4
≠↓AeI8↓AA	A $$⊃∀αα∧β88mM<|λ
,9Y →→w1rP∪ps:p[∧¬∃ε@`rfBα↓AAI@εPHHα ⊂⊂⊂ppl%]NAI←GeC5bA↑α-↔'→3@⊂~w⊂'`4her LangeAdπC@LhR≠βε,fDGε@∧DDαP⊂⊂&Xqr4`3p Re@→KeK]
JA6∧≥g.∞AQ$6λλYLβ   β⊃a\$HI↓α∂∞c#'hpλ
∞Xπsy_vyP+\αit`)∃\AS\αα ?&PD	_;Yn\9y0→CE!@0090λb↓β↓AI↓∞α↓⊂∧@	@A≠CGαc'OA¬∪↔6\,Vv≡T	V∞wX≥@@P¬!@0090λH↓β↓AI↓∞"B@@	@@A6∞≠#'OααK↔≠(∞&.V8T∧n∞β]0-A ∧DPλ⊂⊂⊂⊂λ¬∃ε@`rhnα↓AA↓'∩Hλα""B@@		λ∧@@@@@@~∃λ``rj@@`@@ε ∞&⊂∧@		λ∧@@@A5CGISβ≠Aα,∧f/⊗Yh6*∧β0⊂w≤pp	λ∧∩@@@@@@~)
Aπ∩S$_→∞Y		λ∧∩$⊃⊃!⊂∧P⊂⊂λ⊂⊂⊂εBαC  ↓βI@∪αε',b"B@	    Mac1Sg`AIK@≠↔⊗+;∂∃∧kπ+⊗∞`$Hα ⊂⊂λ⊂⊂⊂⊂α¬∃ε↓β↓e@3Dεββ∩ε-α↓⊂∧@		λ∧∩$⊃∀ααα∧∧α ¬!X≤[⊂↔``@II($Hα" ∧∧λ∪8,≥~0	hλ)2`&↓⊃`↔h0→H&pw*Xv∧DD↓       
B0097∩ 0 dβIP⊂Hα""↓⊂∧@		λ	       
@ε`@↓K1U↓εε#K`""BP⊂⊂⊂∪pqf(pπ`A⊗ ⊗ ,8Y0↔_p¬ MAnqalλ∧∩%↓α↓↓↓↓h ∀~∞&@\⊂⊂029 ⊂∩ λ$Hα""↓⊂∧@	@@@@@∩*εεβKα⊂εββ∩ε."B@@	@@A6∞≠#'OααK↔~(∞&.@Xy(	\8π:`[∧@		       
*≠↓Ae∧¬⊂_⊂∪`@∩$⊃⊃H↓ ∧DD↓       
B00986 0  ↓≠↓D∧⊃⊃$∧λλ∪,≤y~ →\⊂)2`&ereNce @≠↓∞sGπA⊃!∀λλλ∧∧λβ"HX_990   L`d$H@⊂Hλα""B@P⊂⊂λ⊂⊂⊂εB!P⊂990λ@β↓MALH@⊂H
∧∧α∧n≤8
≡|λ∀L\Y<Y-ly(∪,≥]8;↓⊃ ∧@⊂λ⊂⊂⊂⊂β@
C`@rb`!β↓AM↓¬α!⊃ ∧DDαD@		       	∃ε@b``⊂∧βββ0∧
!⊃ ∧DPλ⊂⊂&pXv4yxλ)2s %p¬K]Fα)α7πw+π0$HA↓↓↓α↓↓4T→AEAβ!↓A@α6β0H⊃⊃⊂HH⊃⊃⊂Jα∧∧αααeference Manual
C01035 00315					 Glossary    
C01038 00316				    Maclisp Reference Manual
C01041 00317					 Glossary    
C01044 00318				    Maclisp Reference Manual
C01047 00319					 Glossary    
C01049 00320				    Maclisp Reference Manual
C01052 00321					 Glossary    
C01055 00322				    Maclisp Reference Manual
C01058 00323					 Glossary    
C01061 00324				    Maclisp Reference Manual
C01063 00325					 Glossary    
C01066 00326				    Maclisp Reference Manual
C01068 00327					 Glossary    
C01071 00328				    Maclisp Reference Manual
C01073 00329					 Glossary    
C01075 00330				    Maclisp Reference Manual
C01078 00331					 Glossary    
C01081 00332				    Maclisp Reference Manual
C01083 00333					 Glossary    
C01086 00334				    Maclisp Reference Manual
C01088 00335					 Glossary    
C01092 00336				    Maclisp Reference Manual
C01096 00337					 Glossary    
C01097 00338
C01101 00339				    Maclisp Reference Manual
C01105 00340				  II.I	 Function Index
C01109 00341				    Maclisp Reference Manual
C01113 00342				  II.I	 Function Index
C01117 00343				    Maclisp Reference Manual
C01119 00344				    Maclisp Reference Manual
C01121 00345				    Maclisp Reference Manual
C01125 ENDMK
C⊗;
			       Table of Contents


				 The Language

			     Part 1 - The Language


1.	General Information  . . . . . . . . . . . . . . . . . . . . . . . .1-1
1.1	The Maclisp Language . . . . . . . . . . . . . . . . . . . . . . . .1-1
1.2	Structure of the Manual  . . . . . . . . . . . . . . . . . . . . . .1-3
1.3	Notational Conventions . . . . . . . . . . . . . . . . . . . . . . .1-4

2.	Data Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . .1-7

3.	The Basic Actions of LISP  . . . . . . . . . . . . . . . . . . . . 1-13
3.1	Binding of Variables . . . . . . . . . . . . . . . . . . . . . . . 1-13
3.2	Evaluation of Forms  . . . . . . . . . . . . . . . . . . . . . . . 1-15
3.3	Application of Functions . . . . . . . . . . . . . . . . . . . . . 1-17
3.4	Special Forms  . , . . . . . . . . . . . . . . . . . . . . . . . . 1-21
3.5	Binding Context Pointers . . . . . . . . . . . . . . . . . . . . . 1-∩4


			     FuncTion Descriptions

			Part 2 - Function Descriptions

¬
1,	Predicates . . . . . . , . . . . . . . . . , . . . . . . . . . , . .2-1

α2.	The Evaduator  . . . . . , . . . . . . . . . , . . . . . . . . . , .2-7

3.	Manipulating List Structure  . . . . , . . . . , . . . . , . . . . 2-15
3&1	Consepε@@9αq↓9↓p↓0∩αd¬bαr¬dα`$	HD¬HH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗@15
3.2	Lists  . . ., & . . .(∧@\@8@\@\P@L@8@\@\P	↓9αq↓9↓p↓!↓9αq↓9↓p↓ ∩αdε"k↓Q#~s1_⊗g→<X.M9{@⊂≠q⊂&$\βt StppGiUeJ@\α↓ ∩αd¬bαr¬`α@$	HD¬H@¬⊂∪⊂↔λ↔⊂↔
α & . 2-"3
3.P∪ ∪π⊗c↔M↓p∧α@d	HD¬H@⊂
ε  ≤@8@\@\α↓ ∩αd¬bαr¬`λ¬⊂⊂∞ . . .P	↓→αq↓9↓p↓ ∩αd¬bαr &&!"LeF"4{N8∧ing  & . . .(∧@L@8@\@\X	↓d¬bαr¬`α@$	HD¬H@¬⊂⊂∞ . . .(∧@L@8@\@\α↓I5Mλh ∪~β@≠∧↓Hp@:←→↓↓d¬bαr¬`λ¬⊂∪⊂↔λ↔⊂↔
α  ≤@8@\@\P	↓d¬bαr¬`α`$λπ⊂↔λ↔⊂↔ (@L@8@\@\P	↓Ihε3_h!Q#"p_`≠
}h≠`∪λ!ww:≤0∂l  (∧@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@@9αq↓9↓p∧β∩k4¬#!ε	@_D⊂βonditi`∨]¬Yf@\α↓ 2αβHD¬H@⊂
ε  ≤@8@\@\α↓ 2αβHD¬H@⊂
ε  ≤@8@\@\α↓ 2αβHD¬H@⊂
ε "
Lhλ(αM↔∧dr2\αadi@=\@@\α↓ 2αβHD¬H@⊂
ε  ≤@8@\@\α↓ 2αβHD¬H@⊂
ε  ≤@8@\@\α↓ 2αβHD¬H@⊂
ε  ≤@HZfp~(h\f∪9←\[Xαs∂π@λWFOL∧h∧¬H@⊂
ε  ≤@8@\@\α↓ ∩αβHD¬H@⊂
α  ≤@8@\@\α↓ 2αβHD¬H@⊂
α  ≤@8@dJ ε@@P¬~↔4	Ca@jπ≠'+≤∧⊗v"λ0mnα97`,h	S@:∧pλλ↓y0∩o@I`
↓d¬bαr¬`λ¬↓⊂⊂∞ . . .P→↓d¬bαr¬`λ¬↓⊂⊂∞ . . dαiQXQ!P@ ε@
	λ∧∩α$H@$Nα#"@↓ε@
5.	AdoMic @'e[E@?dε2αr¬`λ¬↓⊂∪⊂↔λ↔⊂↔ (@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂↔ (@@9αq↓9↓p∧α@dλπ⊂↔λ↔⊂∩4hr4S)0∪λα5~T⊃P⊂v≤p¬ C@⊃Q@⊃↓p∧α@dλπ⊂↔λ↔⊂↔ (∧@L@8@\@\α↓ ∩αβHD¬H@⊂
ε  ≤@8@\@\α↓ ∩αβHD¬H@⊂⊗Z∀FB~W↓∧U42P(≤4πpe@Ii`%αd¬.z⊂⊂↔λ↔⊂↔
α & . . .(∧@L@8@\@\P	↓→αq↓9↓p∧α@$	HD¬H@¬⊂→⊗@52↓α5.3	ThE PriNt-Name  ≤@8@\@\P@L@8@\@\P	↓9αq↓9↓p↓ ∩αd¬bαr¬`α@$HD¬H@¬⊂∪⊂→X[εE
W~∧d[82y7~w3P7Yα Symbols , . . . .(∧@\@8@\@\X@\@8@\@\P@\@8@\@\X@\@8@dZj`~∀j\T∪	KLαK;'≠8απS?nK
αONk?3~βπMα7+;∂SL{;M↓r↓0∩αd¬bαr¬dαbαd¬bαr¬dα`$	HD¬HC&f!"C!&KB3N]8Y<NP⊂↔⊂
α . . . . , . . . . , . . . . , . . . . . . . . . ,∧@\@8@dZlT~∀l\D∪≥k[	KdA↓β∪↔∪'≡S↔Mα↓9↓9αq↓9↓p↓1↓9αq↓9↓r↓0∩αd¬bαr¬dαbαd¬bαr¬dα`$HD¬HC&f#"MEf@0sm↑_<Z.={HD¬HH¬DHD¬HH¬dHD¬HH¬DHD¬HH¬dHD¬HH¬DHD¬HHε%-Mc!&KLbλ={]Y.9twwλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗K∞FE≠↔
∧`y4]46rz~qP↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→[XFE
↔~Db↑87w2[:4pz~ww⊂0[2⊂&7Ypy4z~6P#:[1z4w[9P↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗[\CE≠↔≠αj94s[w7vr]94qP⊃:w1j~ww9Pλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→⊗N_εE≠≠Di0[27vP⊃:w1j~ww9P⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\_FB≠↔≤∧S7stqXv⊂'x→y0z4[w9P7[⊂':vX2y9Pλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗LεEεE
U∧ad_y0qz→y⊂&p[4x:v_z4wwλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\~FB≠W_DPt0a0Xz2y⊂∩βbjects  . . . , . . . . , . . . . , . . . . . . . . . ,∧@dZ`j~∀n8d∪πQ¬eCGi∃dA'iIS]Of@\@\X@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@HZpr~(~∀`\%βeeCef@@9αq↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓9↓r↓9↓9αq↓9↓r↓9↓9αq↓9↓r↓1↓Ihπ∪λh!Q#Jp→\↔πε≥lr∧7]l7&N⎇n2ααd¬bαr¬dαbαd¬bαr¬dαbαd¬bαr¬dαbαd¬bαr¬dαrαd¬bαr¬dβ∩k↔⊃PPh!Q hPQ!⊂HH∀∧¬&FT
7O∨L]PhPQ!⊂HJ∧∧ααα
λ↔↔"ε4αj¬MR¬∨≡:F.hQ!PPλ&∃`M&T¬∨O>LVjαβHD¬HH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂α . . . . . . . . . ,∧@\@8@\@\LZb~∀D\bβ)!JA)←@A→Km∃XA
k9GiS←8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\XfJB4⊂b\d%↓eKC-a←S]Qf@@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\X@\f4j~∀b8f∪π←9ie←X↓πQCe¬GiKeL@\@\X@\@8@\@\\@\@8@\@\X@\@8@\@\\@\@8@\@\\@\@8fZr~(bTh∪∃qGKaQS←]C0Aπ←]⊃SiS←8A⊃C]⊃YS]N\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@fZbT~∀b\P\b∪)!JA→∪M AeI←dA'egiKZ@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\fZbj4∀b\h8d∪+g∃dA∪]QKeekAif@@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@LZbl~(b\h\L∪πCi¬Y←Ok∀A←LAUgKdA%]iKeIkahA
QC]]∃Yf@\\@\@8@\@\\@\@8@\@\\@\@8@\@f. . . . . . .3-28
1.5.2	Functions for Debugging  . . . . . . . . . . . . . . . . . . . . . 3-28


									ii

1.5.3	The Trace Package  . . . . . . . . . . . . . . . . . . . . . . . . 3-35
1.5.4	The Stepper  . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-40
1.5.5	The MAR Break Feature  . . . . . . . . . . . . . . . . . . . . . . 3-56
1.6	Storage Management . . . . . . . . . . . . . . . . . . . . . . . . 3-60
1.6.1	Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . 3-60
1.6.2	Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-61
1.6.3	Storage Control Functions  . . . . . . . . . . . . . . . . . . . . 3-64
1.6.4	Dynamic Space and Pdl Expansion  . . . . . . . . . . . . . . . . . 3-65
1.6.5	Initial Allocation . . . . . . . . . . . . . . . . . . . . . . . . 3-66
1.7	Implementing Subsystems with Maclisp . . . . . . . . . . . . . . . 3-69
1.7.1	Entering LISP  . . . . . . . . . . . . . . . . . . . . . . . . . . 3-69
1.7.2	Saving an Environment  . . . . . . . . . . . . . . . . . . . . . . 3-70
1.7.3	Gaining and Keeping Control  . . . . . . . . . . . . . . . . . . . 3-73
1.7.4	Purity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-74
1.8	Miscellaneous Functions  . . . . . . . . . . . . . . . . . . . . . 3-79
1.8.1	The Status Functions . . . . . . . . . . . . . . . . . . . . . . . 3-79
1.8.2	Time   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3-102
1.8.3	Escaping from LISP . . . . . . . . . . . . . . . . . . . . . . . .3-102
1.8.4	Additional Functions . . . . . . . . . . . . . . . . . . . . . . .3-104



			    The LISP Compiler

			Part 4 - The LISP Compiler

1.	Peculiarities of the Compiler  . . . . . . . . . . . . . . . . . . .4-1
1.1	Variables  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4-1
1.2	In-line (or Open) Coding . . . . . . . . . . . . . . . . . . . . . .4-3
1.3	Function Calling . . . . . . . . . . . . . . . . . . . . . . . . . .4-5
1.4	Input to the Compiler  . . . . . . . . . . . . . . . . . . . . . . .4-7
1.5	Output of the Compiler . . . . . . . . . . . . . . . . . . . . . . .4-8
1.6	Functions Connected with the Compiler  . . . . . . . . . . . . . . 4-10

2.	Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-11

3.	Running Compiled Functions . . . . . . . . . . . . . . . . . . . . 4-17

4.	Running the Compiler . . . . . . . . . . . . . . . . . . . . . . . 4-19

5.	The Lisp Assembly Program, LAP . . . . . . . . . . . . . . . . . . 4-25
5.1	LAP on the pdp-10  . . . . . . . . . . . . . . . . . . . . . . . . 4-25
5.1.1	The LAP Function . . . . . . . . . . . . . . . . . . . . . . . . . 4-25
5.1.2	Valid LAP Code Forms . . . . . . . . . . . . . . . . . . . . . . . 4-27
5.1.3	LAP Syllables  . . . . . . . . . . . . . . . . . . . . . . . . . . 4-31
5.1.4	Differences Between lap and faslap . . . . . . . . . . . . . . . . 4-35
5.2	LAP on Multics . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
5.2.1	LAP Words  . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-36
5.2.2	LAP Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 4-37
5.2.3	LAP Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-39
5.2.4	LAP Expressions  . . . . . . . . . . . . . . . . . . . . . . . . . 4-40
5.2.5	Using LAP  . . . . . . . . . . . . . . . . . . . . . . . . . . , . 4-41


									iii

α6.	Calling Prkgrams Written in Other Languages  . . . . . . . . . . . 4-43
6.1	The defpl1 Declaration . . . . . . . . . . . . . . . . . . . . . . 4-43
6.2	Producing fasloadable fiLes with the Midas Asseebler . , . . . . , 4-∀8

7.	INternal ImplementatiOn Detaids. . . . . . . . , . . . . , . . . . 4-53
7.1	The PDP%10 Implementation. . . . . , . . . . , . . . . . . . . . , 4-∃3
7.2	Co@9mK]i%←]fA→←dA
U]GiS=]fAS8A→Sg@\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@PZjf~(n\f∪%]iKe9CXA%=kiS]∃fAM←HAkgJ↓ErA→¬ AG←⊃JT@\P@\@8@\@\X@\@8@\@\X@\@8@hJjd~∀n\P∪%←kQS]Kf↓MWdAβ+O∃β↔Iα#πv!6∂?&+⊃α2	↓↓9↓r↓ ∩αd¬bαr¬dαrαd¬bαr¬dα@$HD¬H
β&f#"Mef"5~T∪=;∞
8|h	≥<≠⊂∩[rs:0]4ww⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂
⊗[XεB≠W≠∧Q0z0P∀2x92\pw:0]4ww↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂~⊗KLεA≠W
Dbw;~y7w6Yw:⊗⊂∀z0qu\V⊂)2Ytyz2\9P↔⊂
α . . . . , . . . . , . . . . , . 4-73
5*8	Calling SeQuafces. . . . . . . , . . . . . . . . . , . . . . . . . 4-74
7.9	Operators. . . . . . . . . . , . . . . . . . . . . . . . . . . . . 4
74


I.	Glossary

II.	Indices:
II.I	   FuncTion Index
II.II	   Atom Index
II.III	   Concept IndeX
¬
									iv
			     Part 1 - The Language
¬



1"  General Inforeation

¬
1.1  The Maclisp Language


   Maclisp is a dialect od Lisp developed at↓~]∩]PP@∨M¬βK?+.≠Qα6→↓βπv!α5:JrQ9∨_h*πK&K≠'∂N1α'w#↔33N;↔;∂*α3π␈∪πS?↔Iβ≠?⊂βWO∃εK9βπ↔#'≠π≡Kπ1↓εK;S↔dc'∨↔v≠∃βK/≠↔πK≡@4+πv!↓βK.cπS↔ β≠'↔f#M9↓αα7π∂dKOAβM→↓β∪/≠∂↔;&+⊃β≠⊗{5↓β&C∃β∞|k7?;gI7/;⎇;9↓αfK@∨αε∃c(h,M⊗∞f\:CJε
zv/6↑%Bεn≥o∩ε6\≡G/⊗↑4ε}2∞Mε*εL≥f?.≤|RεF≡h	$Y9;Dz_;L|9λ≠n$_=!m\9]→,EC"C!$λλ∃

<h→
|⎇;9-nλ~0→H4w:2[22b both as apefeRence qource foHAiQJ↓YC@:?+π∂∃∧;⊃β∂_4+¬¬+O↔	?→β∨WN#∀'SzβS#K,)β'7εc↔7↔w#πS'|sM2∧∧¬&F↑8Rε∂,UBεNd∧ε≡G-yf}f|⎇⊗≡∞Dλn→<C↓Q]~→$∧∪+R%JHλλ≡]~1M≤z8;∧	9]→-Mα4sr[1rP⊂∪0q∪yH⊂4vx≠2rrg≥0r4g[⊂7w∧]42P⊂⊃ ¬C pdp-!⊂
coMpqteR ufDep∧AiQ∃Sd@Aα{C↔K∂#';≥¬≠gOS,iα&R~aβ#↔⊗+π6LXD∧≤Y0∪→y92bλ:7@ !pε@@EQQJA∪Q&~∃S5aQK≠∃]aC&K?91⊂∧α¬π-x
L\⎇λ∪(_i|h∧
9<∪]9;]≡~;sD
yHλ	πw2`9w`YX≥`
β[,ε'<∧p∂nA@∨→∧εFF(β"S.]≥~0⊃\β sySte`~X↓QKeK¬I`∪↔⊂∧π,9Y →≤αed QZAC↓~↓↔~⊃(	↑8ε"4XyP4`-p`	K↓n+;@&_¬~-⎇KB,≥Yλ⊂~~2BEverc@Sαs9↓β&CπQβ↔+;M↓∧{9βSF)↓α∩,→βC∪αiE@'(s∪↔I∧"⊗
∨~↓αR>¬→5EAαβ?C↔⊗S'hpλ∞|yz2[P∧
!KeKC→aKd@α≠π33,∧Bαα.Mε*∧HX2k∧	⊗OεLYV.wL≡FN}e`λA~~→(λλαaV@00  I5a@∪⊗¬\Vw_0~4[w⊂0v≤βo
Ic]fAU]IKdα↓αR⊗t*aβmentations   are  closely	 related,  they   are  sometimes   referred  to
collectively as  the pdp-10  implementation.  There are  reputed to  be several
other implementations.

   These implementations are  mostly compatible; however,  some implementations
have extra  features designed  to exploit  peculiar features  of the  system on
which they run, and some implementations are temporarily missing some features.
Most programs will work on any implementation, although it is possible to write
machine-dependent code if you try hard enough.

   The Maclisp system is structured  as an environment, which is  essentially a
set  of names  and bindings  of  those names  to data  structures  and function
definitions.   The environment	contains a  large number  of  useful functions.
These functions can be used  through an interpreter to define  other functions,
to control the environment, to do useful work, etc.

   The interpreter is the basic user interface to the system.  This is	how the
user  enters "commands."  When	Maclisp is  not  doing anything  else,	such as
running a program, it  waits for the user to  enter a Lisp form.  This	form is
evaluated and  the value is  printed out.  The	form may call  upon one  of the


March 3, 1979							       Page 1-1
			   Maclisp Reference Manual


system functions (or a user-defined function, of course) to perform some useful
task.  The  evaluation of  a form  may initiate  the execution	of a  large and
complex program, perhaps never returning to the "top level" interpreter,  or it
may  perform some  simple action  and  immediately wait  for the  user	to type
another form.

   It is also possible to get into the interpreter while a program  is running,
using the  break facility.   This is  primarily used  in debugging  and related
programmifgactivities.

   The functions invokeD by the top-level interpreter May be executable machine
programs, or they may themselves be interpreted.  This is entirely a matter oF
choice	¬]HAG=]mK]%K]GJ8@@A)!JAgsMiKZ@↓Mk]GQS←]f↓CeJ@↓[←gi1r@A[¬GQS]∀Aae←≥eCKf8~∃+g∃`AMk9GiS←9f∪Ce∀Akgk¬YYb@↓MSegPAkgK⊂AS]i∃aaeKQSmKYd\@@A¬MiKd↓iQKrAo←e,XAiQ∀~∃G←5aSYKHA[Cr↓EJACAaYSK⊂Ai↑@↓iQKZ0Aike9S]NAQQKZA%]i↑A5CGQS9JAae=OeC[L@AoQ%GPAG¬\~∃i!K\AE∀AY←C⊃KHAS9i↑Ai!JAK]YSe←]5K]h\4∀~∀@AβYX↓←LAi!SfASLAI←]∀AoSi!S\AB↓gS]O1JAG←9gSgi∃]hAY¬]OkC≥JXA→%c`X@↓oQ←g∀AmSeQkJ~∃%f@Ai!ChAi!J@AI¬iBAgQekGiUeJ@A%fAgS5aYJ@↓C]HA≥K]Ke¬X@AK9←kOP↓iQChAae←≥eC[f↓[Cr~)KCgS1r∪←a∃eCiJ↓←\@AAe←Oe¬[fX@↓C]HAQQCh@↓iQJ@↓ae←OICZAgQekGiUeJ@A%f@Ag%[aYJ↓C]H~)OK]KICXAK9←kOP↓iQCh↓ShAG¬\AEJ↓kgKH↓CfAB↓G←[[¬]HAY¬]OkC≥J\~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)!COJbZd∩$∩@@@&bZb8b∩∩∩@A≠CIGP@f0@brnd~∀_∩∩∩@@@@↓∂K]KICXA∪9M←e[¬iS←\4∀~∀~(b\d@↓'iek
ikeJ↓←LAi!JA≠C9kCX~(~∀~∀@A)Q∀A[C]UCXASLAOK]∃eCYYdAgieUGike∃HAS]Q↑AgK
iS←]LA←\AACeiS
kYCdAi←a%GfvA∃CGP~)gKGi%←\AG=]iCS9fAKqAYC]CQ←er@↓iKqh↓C]HA→k]Gi%←\AI∃MS]SQS←]f0@AS]QKega∃egKH8@A∪\4∃OK]∃eCXXAKCG ∪gKGQS←\A
←]iC%]f@A	←iP∪∃YK[K9iCer↓C]H∪
←[aY∃p@A[¬iKeS¬XXAo%iP~∃
←[aY∃qSir↓S]Ge∃CgS]≤Ai←o¬eH@AQQJAK9HA←LAiQJ↓gKGi%←\\∪¬\@ACaS←[CQSFXAMiK`[	rZ~∃MiK`A⊃KmKY=a[K]P@ASf↓]←hAUgKH\$A
eKEkKMi1rAiQ∀A[←e∀@AG←5aYKp↓S]M←I[CiS=\@AS8AB~∃MKGiS=\AoS1X@ACMgk[J↓W]←o1KIOJ↓Me←ZA←iQ∃dAgK
iS←]LAoQS
P@ACAaKCd↓YCiKH@AS\↓iQJ~)[C]k¬X\@AQQJ@A9KnAkMKdASL@ACIYSgKH↓iVAg-S`@A¬e←k]⊂XAeK¬IS]Nαβ↔πKgI↓β∂FCS↔↔→βπ: h+↔π⊗ceβO.≠S'?w→β?→∧≠#πC&+CMβ6KCOQph(4	α↓α?≠&+9β∪/≠∂Kππ#'?;~↓β?→∧c'OAε3W;∂&K?;Mαβ←'∪bβ∃β>K[↔9αβ;?Q∧¬vvg∀λ
-dλ≤∀M}y(⊂N↑β"X-N{h⊂∀[⊂:2i~yP7sλ7z42\⊂&4i\⊂3:w_z4ww≤Pε	These Are as acc@UaCiJ↓Cf@AA←ggS	YJXA	kh~∃MQWkYα!β;>"β∃β&'↔d
F}z
H
.L<X;
N+Hλ
M→: →λ4ptwλ8:y8≠yrP )pεAi↑↓g@↔JεhRε∂4∧ε
π9x
.y#"M|H→0≤_vx6 %pεD
∀4∀@@A¬GGKgMS]NAαC;≠?⊗kπS'|¬bεNd
FF*
\⊗w∞≥DεO~LWε.lLVw"
xDYp~4λ:42P≤yryβ\P62k→v⊂7`&	αabiliti and @QQJAaUaa←f⊂AMO∧αβW#'≤¬απ≡Tε␈∩	RεO4λ
.pp∞G↓aQJA5C]kC0P	↓↓¬## ?\⎇αε≡|`W α@
Do co@-∃`	βK,∧⊗&NβY`⊂~yP77]⊂92`#omeE↓9IKH!iQ←,;!β;xεBε/λ8∞↓p∧e@HαA1β&α@εO~∞0
,|βry@4e`λAi!Ch~∀β≠?7⊗x¬f*π⎇
rεF≤4εv.lXD∞≤Y0≠~wzy`,y  s∃K\Ai!SfA[¬]cCX↓Ee@>α}6*πM∞&␈.⎇λ∧
=λ∞↓0∂uC@!S]N~)iQJAα∪↔∂'vs';≤∧¬f$→08m∧≤⎇0⊃→4{$@sion @QQCH∩αK@~εM⊂nL9∀≠⊂:42H*0q6→P7s⊂λ!sw*→w: ∪, i`≤~)[eIKβ⊃β@&t→L≥8∧v)ar`∪↓PBεF≥↑6.fdλN⊂4"@2pπ@↔Ldπ>OMλ∞↓42P&Xz2y4_v⊂:4_z⊂$@t cgn@QC@'n5bα∧MqP@,X;Q∧8π⊂answe@HA`∪=αβ@≡}XTπε∞∧P~4Xzpar q`+↓(∞7&Nβ{@⊗λ0π`≥
A@7↓↑0
∧∞αq`% one =@→↓β&C∃βC⊗sS'∪,∧@H⊗≤0λl↑|h⊂⊗Yz4'@$pε@9↓¬≠' 68TπM→(⊂⊗Xu2`vλ4qP 3pre@Fβ#@/⊗X	⊂_8	 topics oje ↓
CTAkβ≠∃βSF)αSπ⊗c∀4-p→Dλ{{U]β: 3 p	QC↓ ∧εO~λ`≠@\¬jdAαQβSF!β⊗>K0⊗X∧w#H0∂f QQJA≠¬]`↔πbaβπh	⊂≤∧he ↓5[eJ@ε#↔SπH
F.β"@:_q0eLA@?→&nwLPN∞h⊂∪n¬`↔+⊂∧∧ε∂α∞Mε*ε,P	m≥Xπ )↓9@≥β?2β↔π∞¬λ∧πs⊂4he s↓!pA[↓∞S0∨∩∧≡X
 3, p	↑~)@≠'h	⊂≥pλebe i`≥↓0
`.0
a@i![TA↓xbε
λ	y-@2p∩al c`→CM`
β←H¬FD_Y(↓0∂uN@⊂P→↓α(
gN\ ⊂h¬Y`∪<∞FF*λ0⊂[8¬al
λ¬S@M⊗G≡β`⊂fac`∪XεC@&∞¬→0∩λ18	↓QQJA∂1P∂ON∂∪e↓α∧≥f"πMλ	∧λxπw "eptA ;∪⊗β∧∞βp )↓λ!βεε,Rαεh`:[αd Atλ
+↓Mλ	∧8π $8@@Aβ1`∂-α∂!β@&λ	"Yu2 ↓82πMλ	∧∧≠0;N↓pp@ε@⊗*λλ ⊂λ ε`+↓t∧ .↓4p∂n↓∪P≠∪(παε∞βY⊂λ0p∞ Ap	@∨]⊂_@B¬∃'sαkβ}@λ∩-L→8 u`⊃SFαAβπ↓,Tππ⊗βxX,ε0→@αk7OQαβ@/≡X	@:Z⊂:7@_P92`'qha@dαβπ+⊂∧≤L↑→0⊂z→p∧	@jπ≠↔Iα¬p→A↓@
`)Q⊂AISC1KGh_αβ7Iβ&yβπd→∂∞→<Z,]Xp∩@d  us@⊃`	β?2βπ+x
~↑H⊂∩4_t2`#↓PXAoQ<A`∨&ε0~↑`∧`4o f`∪]⊂∩+x
 :λ8∧hE ah
Go⊃`	βSx↓β¬β∂+↔OSH¬`-D_8[N↓x⊂ @  sp@Kα≠'6α8h↓8¬`≥↓_∞FN↑e`λ∧
x⊂∩@. `∨M
AgK↓_∞FN↑d@Xε~*εMε*εX≥g∞∞β⊂apπgk≠⊃`
β.v{←#⊗∧Lv*ε|dε∞Vβp
4→y⊂9@%atio8ABA`α≡(⊂↔*[q2y p¬KM
π∪↔+∞*↓β@&t≥
 εEn¬iQKdαβ@≡8⎇~-⎇H≥z-α⊂#r[2q0v~8	 @E∀AOS0∧Frpβ"C!
∀~(∩(Q!P@ ε@

	∃≠CIC@@ε0@b@e;H$∧⊂λλ∧∧∧`_@-1 d∩ ∩β!C≥J@b↓hε0hP@H⊃∀αα∧β88mM<|λ
,9Q →→u1rP∪pp∞ualλ
(hP$S∃`d∧⊂π7@tatio9CXAεα{;@6]jFN}n1P@ α@

   @)!KeJAαC∃β≤¬vN(⊂`↔[92w:~ww9P≠pε @]=aC@SL¬frπM↔"ε↑Z7"ε,Tε@\f  the characters equal sign	and greater than  symbol, "=>",
will be used in examples of Lisp code to mean evaluation.  For instance,  "F =>
V" means that evaluating the form F produces the value V.

   All uses  of the phrase  "Lisp reader," unless  further qualified,  refer to
that part of the Lisp system  which reads input, and not to the  person reading
this document.

   The terms "S-expression"  and "Lisp object" are  synonyms for "any  piece of
Lisp data."

   The	character "$"  always  stands for  dollar-sign, never  for  "alt mode,"
unless that is specifically stated.

   The two characters accent acute,  "'", and semi-colon, ";", are  examples of
what are called macro  characters.  Though the macro character	facility, which
is explained  in Part  5, is not  of immediate	interest to a  new user  of the
dialect, these	two macro  characters come preset  by the  Lisp system	and are
useful.  When  the Lisp reader	encounters an accent  acute, or quote  mark, it
reads in the next S-expression and encloses it in a quote-form,  which prevents
evaluation of the S-expression.  That is:

				  'some-atom

				  turns into:

			       (quote some-atom)

				      and

				 '(cons 'a 'b)


Page 1-4			    ∪1-1.3			   March 3, 1979
			      General Information


				  turns into

		      (quote (cons (quote a) (quote b)))

   The semi-colon (;) is used as a commenting character.  When the  Lisp reader
encounters it, the remainder of the line is discarded.

   The	term  "newline" is  used  to refer  to	that character	or  sequence of
characters  which  indicates  the  end	of  a  line.   This  is  implementation
dependent.  In Multics Maclisp, newline is the Multics newline character, octal
012.   In  ITS Maclisp,  newline  is carriage  return  (octal  015), optionally
followed by  line feed	(octal 012.)   In dec-10  Maclisp, newline  is carriage
return followed by line feed.

   All	Lisp  examples	in  this  manual  are  written	according  to  the case
conventions of the Multics implementation, which uses both upper and lower case
letters and  spells the  names of most	system functions  in lower  case.  Some
implementations of Maclisp  use only upper case  letters because they  exist on
systems which are not, or have not always been, equipped with terminals capable
of  generating and  displaying the  full ascii	character set.	 However, these
implementations will accept input in lower case and translate it to upper case,
unless the user has explicitly said not to.






















March 3, 1979			    ∪1-1.3				Page 1-5
			   Maclisp Reference Manual














































Page 1-6			    ∪1-1.3			   March 3, 1979
				 Data Objects




2.  Data Objects


   Lisp works with  pieces of data  called "objects" or  "S-expressions." These
can  be simple	"atomic" objects  or complex  objects compounded  out  of other
objects.  Functions, the  basic units of a  Lisp program, are also  objects and
may be manipulated as data.

   Objects  come in  several types.   All types  are manifest;	that is,  it is
possible for a program	to tell what type an  object is just by looking  at the
object itself, so it is not  necessary to declare the types of variables  as in
some other languages.  One can make declarations, however, in order to	aid the
compiler in producing optimal code.  (See part 4.2.)

   It is important to know that Lisp represents objects as pointers, so  that a
storage cell (a "variable")  will hold any object,  and the same object  may be
held  by several  different  storage cells.   For example,  the  same identical
object may be a component of two different compound objects.

   The data-types are divided into three broad classes:  the atomic  types, the
non-atomic types, and the composite  types.  Objects are divided into  the same
three classes according  to their type.  Atomic  objects are basic  units which
cannot be  broken down	by ordinary chemical  means (car  and cdr),  while non-
atomic	objects are  structures constructed  out of  other  objects.  Composite
objects are indivisible, atomic,  entities which have other  objects associated
with them.  These other objects may be examined and replaced.

   The	atomic	data types  are  numbers, atomic  symbols,  strings,  and subr-
objects.  Atomic symbols can also be regarded as composite.  See below.

   In  Lisp  numbers can  be  represented  by three  types  of	atomic objects:
fixnums, flonums, and bignums.	A fixnum is a fixed-point binary  integer whose
range  of values  is machine-dependent.   A flonum  is a  floating-point number
whose precision  and range  of values  are machine-dependent.	A bignum  is an
infinite-precision  integer.   It is  impossible  to get  "overflow"  in bignum
arithmetic, as any integer can be represented by a bignum.  However, fixnum and
flonum arithmetic is  faster than bignum  arithmetic and requiRes  less memory.
Somatimes the word "fixnum" is	Used to inclqde both d¬Sq]U[fAC9H@AE%O]k[L@QR]∀\~∃C1XAS]QKOKeLRvAS8AiQSLA[C]UCXXA!←oKm∃dXAi!JAo←IH@EM%qUkZλAoSY never be used to
include bignums unless that is explicitly stated.


March 3, 1979			     ∪1-2.				Page 1-7
			   Maclisp Reference Manual


   The	printed  representations  for  numbers	are  as  follows:  a  fixnum is
represented as	a sequence  of digits in  a specified  base, usually  octal.  A
trailing decimal point indicates a decimal base.  A flonum is represented  as a
set of digits containing an embedded or leading decimal point and/or a trailing
exponent.  The exponent is introduced by an upper or lower case "e".   A bignum
looks like  a fixnum  except that  it has enough  digits that  it will	not fit
within the range available to fixnums.	Any number may be preceded by a +  or -
sign.  Some examples  of fixnums are  4, -1232, -191.,	+46.   An example  of a
bignum is  1565656565656565656565656565656565.	Some  examples of  flonums are:
4.0, .01, -6e5, 4.2e-1.

   One of the most  important Lisp data types  is the atomic symbol.   In fact,
the word "atom" is  often used to mean just  atomic symbols, and not  the other
atomic types.  An  atomic symbol has  associated with it  a name, a  value, and
possibly a list of "properties".   The name is a sequence of  characters, which
is the printed representation of the atomic symbol.  This name is  often called
the "pname," or  "print-name." A pname may  contain any ascii  character except
the null character, which causes trouble in some implementations.  For examplE,
a cerdain atomic symbol would be represented externally As foo; internally as a
structure containing the value, the pname "foo", and the propertieq.¬

   There are two  special atomic symbols, t  and nil.  These always  have theiR
respective selves as values and their  values may not be changed.  nil	is used
as a "marker"  in many contexps;  it Iq essential  to the construction	of data
structures such  as lists.   t is  usually used  wheN an  antithesi@LAi↑@↓]SXA%b~∃e∃ckSe∃HAM←HAg←[∀AakeA←gJX↓J]N\↓i↑Ae∃aeKg∃]hAi!JAY←≥SGCX↓G←]I%iS←]L@@EiIkJDA¬]H~∀	MCIg∀\DAβ9←iQKHAae←AKeir↓←LAi!JAga∃GSCX↓Ci←[%FAgs5E←XA9SXASLAiQCPASif%GCdA¬]H~∃%ifAG⊃dACe∀ACIO¬sfA]%X\~∀4∀@@AQQJAm¬YcJ@↓←LAC8ACi←5SF@AMs[E←0AGC\↓EJ@A¬]rA←	UKGh↓←L@A¬]rAieaJ\@A)QKIJACe∀~∃Mk9GiS←9fAi↑↓gChA¬]H@A≥KhAi!JAmC1kBA←_∪BAge[E←X8@A¬K
CkgJ↓Ci←[%F@Age[E←YLAQCm∀~∃mC1k@↔MεOO?≡KπS↔ β←'SBβS#⊗haβS#-Iβ∂πp↓β∃π+O↔⊃∧Mβ[∂∪'πf+@~ε≥`ππ⊗|}&∞o4∧ε∞vDλ↔_h$,G.n←∀ε∂⊗|YV.wL4"εNd∧ε .9Xp~~ww9Wλ⊂ z~yP0v≤wP⊂8≠yyta≠2P# /p∧AC\↓Ci←[%F@Age[EOX↓iV~∃!CmJA9↑AmC1k@∃1∧¬⊗rπ⎇
⊗≡B8↔∞*
~BεO4∞6∞ND
Fzε,Tαπ∞lLV&NlX	∧$≠|H∧.;X[n]YHAQA"H∧∧∃~→$∞≤[|↑]≡(
M<⎇λ
|H_;D=≠{-≤h≤}-\[{λ
≡h→>∞
_:;L\λ≠{D∞_9y$εK-,Edλ∩=∧
<h≥.<9β"Lm|H≤n\zλ≥

;Y|d<hλ∞,8{|LM;Y`∞M→(→L≤⎇λ≥
=λ⊂-a8=≠m]8h≤o≥8[{∧
<h≥
(≠X-\(λ≠lD_#"Ln;Xu
≥{KC!!"Hλ∧λ;H_.M{:8d∞};8M⎇λ≥z.Mλλ≠ml(≠tD
[h_m<X8nL<\h
≥Hλ~.Nh≤≠L≥9(~.4≠y]]Hλ_l≥≠→9∧#"HL=_<X,>→<H
|ZY8nDH_;LD≥<y,D≥≠h∞,<≤Y.<;]λ≥H_<l=:(_m<X8nL<KH∧
~→(≡≠{:,4≤};,-{β"N⎇=~λ∀≡Y<Mu;→;L}~λ≤
l;9(∞,<≤Y.<;]≤d∧≥~→$<xz-∀≠];
D_z_.,8⎇→.%λ_;LDλ≥~T≤};,-{≤c!!"C"J9y(ε∃.α"!∀λλλ∧αl+,Ea""(∧∧∪8<L=λk∧ε.-n!Q@↓A"""$λ_=_$	xZY,>≤c"AQC"]m≡~λλ
⎇Y+8m<X8nL<Hλ∞
X;9.4λ≤Y.∞Y<y-nα=~Tλ_z≡X8⎇↑B=z
≤zλλ
≡hλ≥
:<H∞
X;9%a"Q]-l⎇~;mnh≥z
≤zλ≥≥y(λ=_<X,>→<H
|ZY8nNh_<d
;\≥.Dλ≥<n\;≠≡$;≤{d8xy.∞λλ_$∞⎇≤Z-lc"[ml(_z≡X8⎇↑H≠≠mlh≠|D(→Z/
];(↑=8;∧∞≠h≥
(_<l=:+8m|→(≥L≥≥9(m|H≥
(_z≡X8⎇↑KC"H=_<X,>→<H
|ZY8nNh_<LT_;≥l∨<h~-n→<[L\λ≠{D∞~→(
|X<\L∨(
≤l\(≤_,|(K&W
+C!!"Hλ∧λ;[⎇
<H∪
≡|λλL=_(∞O<→(∧
<h≥
(≤⎇∞-;YkD∧λ∃~
≡h~<d∧_(≤l↑=9;L<(λ≠ld_z_.,8⎇→..c"J∞
||z,-≡(≡L↑[k;]Y⎇~¬∃Hλ∀nNZ;Yn4_<Y$∞<y9∧∞≠h~
⎇→λ≠,↑|x9l↑h≥≠dY(≥∂≡→9α-}=λ_-lβ"]
t≠8;M≡≥;_.L(≥→/∞λ≥z]Hλ≥
(≤⎇∞.8⎇≥.,(≠yD∞~→(∧∞→>≥∧
<h≠M}λ_<∞∞[|≤M≤=→",m|H≥
#"].<(≠yD∧[~<nD≤≤[l<<|z-lkHH
M→(≤∞-;]→,D≤Y<∞,<y;NL=~;md≠yH∀≤⎇≤M≥Yh~.4λ_(∞<<=9-ly#"M|H_z≡X8⎇↑\h→-l{≠|l\λ~;D≠⎇8ML+<=-}→<k∧+YkD∧Y[{d%Hλ∩,d_(λD
<h≥
tλ_Y$
;X{∞\→9β!-;Hλ∞M→(λ∞>≤Z;Luλλ~.Dλ~<d∧≥|Z.N→;H∧∞≥z8lUλλ→%lkHλ∧,[{hD,X<HD∧~<h∧∧→[{d,X<KD∧λ∩;AQZ;<
L;9;NL=~;mnh≥z.M≠⎇=∧∞⎇≤Z-l|kλ≡≠{:,4λ≤}-\[{≤d<Y(∞↑y9λ
≥\⎇→,≤Hλ∧
~→(∞≤,&↓"Z;.
→;9-n_=~-⎇\h_n↑\Y;NM≡(≠≤zh≤nNZ;Yn5C"C!$λλ⊂$∧\⎇8N%;xZL\⎇λH
≡h_(∞>→8z,≥λλ_.M{:8d_=_%↑≡<→$∞z≠|lT≥<y$
<b;M}[8;
O(~~,L→;C!-;H≥
(~;.
→;9-n_=~-⎇KB0$∞⎇8\E]xZY,>λ≤Y.∞Y<y-n≤h→/8⎇=≤[→(
\8z~-l(λ_m|→+H∧
~→#!,];XnM;{\d]:;∞D~;]
tλ≥~T∪~<n∧≤}<nL;(_.,(λ≤n\\K;l-Y8⎇∞5λ_<d<Y(∧∞<y<D];XnM;{\aQ]~_.D~_=LT_Y9-d_{{.
;→9¬dλ⊂(∞>8\K-|ZY8nD~_<d
[h≤∞-;]→,D≤Y<∞,<y;NL=~;meα<{d88z↓Q\}<nL;(→N]X⎇~-⎇H~_.4_;H≡≠{:,4≤};,-{λ≥m
8zλ∞<<]Y.4_<h
≡≤h≠L≥9+B*M→(λ∞?;8[mD~_<aQ]~→$∞⎇8\E]xZY,>λ_<d(≤≤M}→<]∂∃C"C!$λλ∪ml(_{m↑≠|z.L(λ→≡_(≥∂≡→(~.1=~→$<\X/∃Hλλλ≥H_<N,>(_m⎇\z<nNb;yD(λ≠N]8Y<D
yC"L<;≠≤eD→88m∧≠yH∞⎇~8z∧∧≠8>${{]≥;H_-o(∪~.>λ≠xM,8⎇D∧λ∃~T_y;
Nh≠yD;Hλ≡\X>$<Y#!,8xy.>y9λ/(≤⎇,.x|Z.∞~;Yg4→88m∧_y;
D~<h
l;99∧↑(_$∞≥<≠T≠yH
≥]→9l↑\kH∧∧⊂;H≡\X>!Q[8>$
_=Y$
{Y(
}H≠;n,(→~-\;\z-⎇\nh∞M→(≥.∞→<H
M;:=∧
{H≥
(≠]-\Y<H
|H→~-\;\z-⎇\h~.1"Z;.
→;9-n_=~-⎇K9→,m;Y9¬dλλ⊂-dλ_<N,>(~.1;[⎇∧∧_;≥l∨<h_.>{xz,≡→9α.⎇=~λ∧;H_.M{:8aQ\};,-{λ≥m
8zλ
≡h~=∞4≠X;,UHλ∀L≡~→<EDλ_;D<\X/∀~<h≥≥x>.4→→<m≤{X=\λ_↑$∧_;H≡\X>%Q"\≠m≥]→<ED≥z~,=λ~<d(≤|\z8;∧
z;Y∧
yH_.M{:8d	~<|∧
xZY,>HλλnY<=,]]≠≡%Dλ_;D<\X/∃#"\
⎇;]→.$≥z;
D_Y(∧∞≠_8l\λ≠{D∞~→".∞[|→..≡(≠
≡⎇λ≠ldλ_(∞?;8[mD≥;Y↑Hλ≥
(~;LM8x=
}C"X..X>(≥Yλ≥
;H≥
=λ≤o≥8[{∧∞z;≠∧Y(≥.<9λ_.4≥~→$
X;9$
yH≥
(_<N,>+λ∞=;Xy$∞};8M⎇≤c"L<;H~≡Y(≠-l;;{M≤h≠X-\<h_-lλ_(∞,8<{ml8[→$∞≤Z;NL9λ≤L↑≤Y<l]]_=
≥{KH∧
y9(∞9y(ε%.,#!,[|H≥H→>∞
_;X.M;{H
|H~≠nt≥≠h>Y8=Uλ≥<lUλ_;LD→→;↑→(_..X><ea"C"D∧λ⊂;M}~→<D{{<
}z=→$_=_$∞≡<→$
<hλ∞M→(→M≥→+;l-Y8⎇¬D≥z~,=λ~<d→<xn-8Y9↓≥{H≤≡]β"FULkC!!"Hλ∧
~→".={→(∧
[{K,≡≠{:,4λ→_.L(≥≡.(λ~.4λ≥~TλλXm⎇\kHD∧⊂(λ={\b-≡hλ_$∞⎇≤],>≥<Y!QX{{NL:;Z-lhλ≥∞⎇hλ_m⎇<≠{L]]≤k∧x;≠\λλ≥
(λλL<<HH≥Yλλ∞M→(λ∧,y≤HD∧→[|D
~<⎇
}Z8x-A"\Y,≡{{\edλ
∃
<y(≡Y(≠L≥9<h∧
yH→M≤;→≤d
;H_-dλ∩0IT
l∞&D≠88m
;Y(∞⎇|YE∀λ∃~↑y(≥∞⎇c"Xm⎇<≠{L]]≤h
\>(_LT_;↑$	~<|∧
xZY,>λ→.l;H_-m⎇~→.$_{{N4
~;DX8⎇¬D≥~→/∀λ_{n]→λ→.l;C"L,(≥~Q<x;,T_{{N5+Hλ∧	;H≥

<hλ∞|>(_m⎇<≠→/∧≤⎇≤N\⎇≥<L↑hλ_l≥H_Y$∧_]:-Nλ≥<∧∧≠⎇=∧
yC"N=;<≠T_{{N<<kB)≥]→<Ml;≠≡$(_{mnh~<d∞Y<≤L↑y;]\λ~;D(→[n-(≤z-];_<D∞≠nC!!"C"I\<Xz∧εkλ'⊗n""!∀λλλ∧αl+,Ea"""*9y(ε∃.#"@			   Maclisp RefeRence Manual
∀~(~∀
∀ @@@@@A??⎇????⎇????⎇????⎇????⎇????⎇????⎇???>4∀∩@@@@@Ap∩∩Ax$∩@@Ap~∀%α↓↓↓↓αβq↓↓α↓β∂εα!∩π`≤8GJ∧∧π`h!∀ααα∧∧απe{{u⎇⎇{{u⎇⎇{{u⎇⎇{␈E⎇⎇{{u⎇⎇{{u⎇⎇{{u⎇␈AQ H↔⎇Wε*∞Mε*ε-x∞↑h≤Y.∞Y<p∩[8⊂1`%lh	fA=H	↓βn+7?KJβ#π>)β↔≠xεV.B∞MrεF⎇LBε
∧
ε}NnLWαb≥f h ,6∂∩ λ-lλλXlNH@⊂⊂\2P:;[P⊂8/inteRpεAi↑↓←EEK
ifL@↓)QJAAaSMi∃HAeKAaKgKαsSπ∪L{9↓β|1β∧Q λM⎇\h∩.P:42H⊃27j≤∧ed-pair"↓]WiCQS←\@!α@\AλRAoQ∃aJAα↓SfAi!JAGCHAC@: ∧∧$~<h∞M→(⊂lNKC"APHλλλ≥[⎇~↑H≥x/∀≥≠h∧∞|Z5T≥~→$
;]→.β0v⊂≤αeprepπ@↔≠&S'∨p∧αεyH⊂${{TeD≥z~,=α:4d
8πy2CE1wg≥2s4@%nt f@=`	β3∂∪∨*∞:G.8⎇≥.,<kλ
≡nC"AP@∧DVK←⊂7PVVVFO⊂1r9βADPλ⊂⊂>εB∧@P⊂λ⊂:εEαDP⊂⊂λ+αE∧BP⊂⊂1Xy

λ   There are @QQeKJ↓→Sg`↓@@.l0

≥{\h∧<|sl=8=→,D≥z5
∧_{`↔≤p¬s* cons, cab0@AC]⊂AGID8~∃)Q∀@AMk9GiS←8AG←]L@AG↑αk';-→β'S~↓βS←zβπK∨,k↔;S~↓β';&yβ¬↓∧≠?;MX↓!E↓αq↓I%αβ∂π9ε∪∀4+>+;↔K∂#↔⊃β↔Iβ↔[∞cWπSNs∃↓β≤¬vw~ε∀β∩Jd∧¬&FTg.v>M⊗}r<↔∩π,↑G/⊗n4π&FT6∂∩=voε⎇lVw Q-v2α
≡G~α≡&?.\Yg"b∧⊗v"∞Mε*αnVv∨M≥vrα<G∩α∞,W'∂-n2π&Tαε≡N$αε≡⎇↑ε}v]nBαε|dεO'1Q&∂⊗}]V.wEaPPh$∧α∧}lTπ'OTε}2∞>G↔.>NW⊗*D'.NNDε␈/D
v2ε=⎇g≡/5Dπ&F≡DεO~∞↑6."∞≡VO&T
v7&]eBεO4∞FF(Q$&fO>Eb∩αλ∀αεf≡>BεO4∩απ-}rε}d
v⊗V\>G~`≥|bε∂,-↔'⊗≡/∩εf]lw&Bd∧α∧

M↔∨"∧
v2πM∞&.(Q.FFNl}2β
Dε"bε≥lBβ~
≡2ε≡⎇n7'↔\>F."/∩αα=vw~ε∀αF≡⎇n2β∩¬6}w4ε2εv≥E∩JK4
fNb∧
↔~ε⊃Q'∨ε\=⊗∞b≡F}j∞Mε∂"
≡2π/<\Bπ&t
V∂⊗4∧π&FTVv"
|bε

M↔∨"d∧¬&FT∞7'↔\>G/⊗T
v2α∀εfO>APV≡≥dε⊗*M⊗∞?,≥Vn.D↔≠PQ!PPH∃USrεt¬RjjWdεzαUURkr
tαjjUWbεv≥APPH∀∧ααπA∀ααα∂A∩αα∧∂@hP⊃∀ααα∂A∩αα∧∂@Jα∧∧π`h!⊃∩αα∧
`Jα∧∧¬0J∧∧α¬0Q!⊂Jα∧∧βλJ∧∧αβ⊂∀∧ααβ1Q hR∧∧∧7⊗⎇Tπ&F≡4εO"<⊗rε,Tπ≡.]dπ&F≡Dαπ&Tε≡∂$
v2ε∀
FO∨D
↔~ε≡N2ε6≡.7"α]F.n]nBbπM↔ h.Mε*ε<N"ε}d∩εf≡>BεO4∩εf≡>Bε}d∞FF*]F.n]nG~ε≤nF/∩∞Mε*εm≡'∨"D⊗v"∞Mε∂"∧∞FF*
M↔∨ Q-v2εmtε.f]\Vw'4
↔~πMRπ≡≥\Rε∂4
fNbaQ hR∧∧¬&F≡4εfO>Dε}2ε∃Bβ∩D⊗v"∧ε2ε≡}]F"ε,Tπ⊗/∞,W≡.nLV"ε≥dπ&FTF␈"]mw&∂M≥vrα∞↑6."mw⊂h!Q hU≤v*β∃V∪H⊃∀ααα∧α3
k%a⊂HJ∧∧∧n∂,=αβ~Dε∪K;⊃Q `H⊃⊃∩∧&≡L∩∧}-,V∨'1Q hPQ,6}w<Z2ε∂4∧αC
¬dαC∩¬dαC~¬dεvNE∃∩JR∧	ε␈>↑lW∩b∀εn␈,Tε≡}nlVvN]nBεv}L↔&N⎇a⊗6␈$
FF(Q"π⊗NnLV"π,↑π⊗/<Yg&∂M≥vrε|dεfO>N2εF≡4ε⊗.]dε&.m≥f.#$∧π&FT∧&fO>EVv␈L≡FN}d$αC
ε λε5+C"I≡λ~<d;⊂	wH⊂87y\tq62H:7P4_{2P0Bt8q9~r⊂7sλ:42P≥;wP⊂≠7z0z~ww9P≥t4qtλ4yP⊂≥yrr→7yεE≤z9:q]8y2yH;t4qZ⊂0y2H0v6w\z⊂0P≠4yz⊂λ2|1r\:⊂:4_z⊂:4→|P2g→⊂4w⊂_w⊂0z≠vP⊂7]42y⊂≥40wεB74v↔λ⊂#7yλ2|0v\62V⊂
 P↔⊂
!⊂↔⊂
!P↔⊂⊃∀TTP_pw⊂1→P92x≤2yrw≥2r⊂0\P∀ P⊂⊂!P↔λ"∀WεBεE⊂⊂λ P64\z⊂77]⊂1ww≥0tw4[3P0w≡P⊂2v→vrw:≤P4yP≤2y32Xz6<P≠2spvλ0w2⊂λ392x]rw:6≡P:yrY↔εE*~4yP=→y7Vv→w3z4λ64yzλ4yP4Y2w:4Y4rr⊂≥tz4⊂λ:42P_z7vP≠4v↔⊂λ$z⊂6X|P12H:<x2Y⊂⊂4wλ0yFE→tz42\⊂74vλ7y⊂∀
WεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεE&Xy1t⊂V⊂_\M\DDDH⊂⊂⊂⊂∧XVY↔αDDP⊂λ⊂⊂⊂⊂∀0srPVXXFBβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεE∀0srPTXY∧BDP⊂⊂λ⊂	XVL↔∧DDH⊂⊂&p\1t⊂→K⊂_\[NFEβ∧DDPλ⊂*42H!0ytXP qz~ww9P≠s⊂&$ThεEεBεEεEβE→W⊂λ*42P⊂0ytqH qz4[w9P7Y⊂&$iTεEεEβE→W_H⊂!4w→4w3P≠s⊂+0\4pq6→yFEεBεE⊂⊂λ*42DX0ytqH⊂894[tz4{→yP7sλ⊂897Yy0vvZw3P⊂~w⊂&4\x⊂⊂0\2P⊂;_y4pq≠2yV⊂λ37y6\V⊂0w→εE3:[1z4w[9W⊂⊂⊂P;0y~pq62BtyP0[⊂0z7[tqP9↑vq7vλ⊂;t4Xt⊂40\P0P;_v:rDXyywqZpz2rλ;tz4βE4z≥H:42P≤|vq7[⊂4yP≤ptr⊂≥7P12H⊂17z[2⊂:7H:40zλ;0v:YW⊂⊂*~2P;0[:rP6X|P7sλ⊂1wz\9rP1→FE0w≡P&4y\⊂7q5→qz⊂;Z0z9wY{2y↔λ⊂*42H0z7vZqP⊂9↑vq7vλ0qz9H9tvx≠<P0yH0P70[rP⊂1≡P;t4XtεE:~2P89≠sy0vH6p|P≤2s2yλ:7P:~2P;0[:rP;Z4v2P~z⊂4yH897qYyytw→P4z↔βEεE⊂λ⊂*44\P4yP≤tvtv_y⊂:7H:42P_ww1r\:⊂7sλ;0y4Xq62yH4w⊂7]42y⊂λ897s\0vvt[3P60[3zpsYyWεE∩7{r{→y⊗⊂&~yx∪yH1ww1Yx:⊂7Y⊂:42H9qwx→P7s⊂≠0vryH4yP9]q:6<H24s3→y2w:λ397vBz40zλ7sεE≠wyz⊂λ127qZTyz9≥qz:y→r⊃⊂&_w3zpYryW⊂λ z⊂ H3t{2[⊂6wvYw:⊗⊂_P;0y~pq62H⊂6p|H0qz:Xv6<FB40{"H9r{2\0r⊂1~w24w→yP4gλ2|4y]2w1bKα  Only the moSt reCent, or  current binding0~∃GC8AEJAUgKH\A/QK8ABA]∃nAES9IS]N↓SfAGIKCiK⊂XAiQ∀AaeKYS←kf↓←]JA%`
βC/≠#↔⊃αβ?;Szβ∧4+∨#π∂-pJ'Qβ>K3 ",V≡}\Tε∞≡<Xn≥8[⊃$9x:-d≥z→-d≥~→$X;Y
≥Yh∃m
8z∞≡<→4Nrr2rλ4z⊂ )pε~∃e∃[←mK⊂\@@A
aKCi%←\AC9H@Ae∃[←mC0AWL@↓ESMI%]OfA%`
↓β∨K;∂#⊗{;'k, '←'&AβOW↔∪?WSNs∀4≤3 &≥lrααα_;LD≥z5
∧λ_q.∞α0tgλ9x2`"ia`_↓A@∨Ko→β∪↔≤≠C',!↓β(¬F␈:∀mtλ≥~
≡h≠9,=_;Z.vBEcorreSpknds  cl=`∂πI∀απ&tαFF*∧∧&f@xx;∧∧≥X<M≤8[⊂∩\β" C=]GKaβ!↓β?2↓β/SF+@∩π∞-v >X;;-≥Yc"ML8π#zXpπes.   Howafe@HXA	Sβ≠A↓β_¬fw≡≤LW.hλ⊂~~0r 4here  is Onhp∩@↓←]J@↓mCESα&T
vF|y#!10	nding @	QC@:∧|W4ε⊂90]42y  phan sev@∃`π@l↑_0	0]2@	F¬aSCE1KfAo!SG@AαCπCC,¬`O&t	ε∂6QQ'εFT
6∞nT	f∞nUa∧∞w∀L\β2y2[1rP⊂≤0π A↓mCESα#∃bβ↔[⊗p∧ε.Xπv@ oud`&αK∪∃↓∧εFF*∞λλ.8∧icUla`$~)ae@??∪π%β>C'∂↓∧∧v∂6Tλ
.↓⊂4`∀s current 	S]ISαs⊂~λ→y.∞h≥~T_⎇ →≤αeftbi`≥I%]NAC9HA]←β!β/:(h#∪↔&+Cnα;Y,D_PPλαscO↓AJAeJαc↔Md λ∧	=λλ
≡h≤⊂↔\βsable to pπ@'↑YF∂&Tλ

(≠`:~2q⊂⊂_ww!`$pp o_∩+N≤¬gε*
p→D∧≠X;,↑h_↑$∞αy`)@9@
↓β⊗K;∪'v9β∂?w#↔cQ∧εε}Nβ]→.9P  whicH abe	desc@ISEKλαβ &∞LZ @QJ≤q,T≤_9lTλ# →
∀WεEα@
   Un`→S-JA[C9rA←I!KdA↓`∧⊗v?\≤v/~β∪
≡|λ⊃
|<h∪M}λ_p↔[q0	ne phe conc@∃a`∪M∧{⊂∩α
l⊗n(⊂;LA P	@4orage,∧@A≠¬]rA↓d;∨W∞;↔Mβ∂≠G?∂H∧↔&*∞⎇↔&B⊂λ∞l8Z0,-α2P∀_P70vYTP0@ piec@⊂@A←L↓ci←e¬K@∀Q 
M
8z⊂λ1pw hcld kne obbe@
h@A←α1β¬↓∧εε∂⊗M_λN]_0	 pqpe,  su@
PACFAB@@α3#>_¬~-lh≤∪m≥]β"Mn8ε`"ep∧\@AQQJAm¬aSCE1JOfAYCYkJ↓aKg∪α#↔M↓∧¬⊗rπM
↔4≤⎇≠n0srWλ⊂ r is	dhen I↓5aP∨O≤K#∀hS∪?$λ
∞⎇h≥X.
88[↑h≥≠d∞Y8;
∞(∩_.l(λ]
(≤x-\αQ6alue; kne coul@⊂AQCLα)β¬α∧0n∂(∪qD∞~→#!∞β0v*YP7s⊂_w0∂ther @EUhA]←β!βS#*βGπ\TεNεYnFN≡≥Dε}⊗,X7"pQ!PBα∧
FF*∞=↔π8=~-⎇H~ 7λ&4yxλ own storage.   Binding is
simply an association between a variable and a value; consequently there  is no


March 3, 1979			     ∪1-3.			       Page 1-13
			   Maclisp Reference Manual


reason	why  two  variables cannot  have  truly  identical  values.  Similarly,
erasing the binding between a variable and its value does not destroy  or throw
away the value; it  simply breaks the association.   Of course, if there  is no
other use for the value the storage it occupies will eventually be reclaimed by
the system and put to more productive use.

   Often these processes of creating a new binding of a variable to a value and
reverting to a	previous binding are referred  to as binding and  unbinding the
variable, respectively.

   A slightly  different way  of creating a  binding between  a variable  and a
value is assignment.  When a variable is bound to a value, the previous binding
is saved and can be restored, but  when a variable has a value assigned  to it,
the previous binding is not saved, but is simply replaced.  Thus binding may be
regarded  as creating  a new  level of	usage of  a variable,  while assignment
switches a variable to a different value within the same level.   For instance,
a subroutine or  function may bind  a variable to an  initial value when  it is
entered, and then  proceed to make use	of that variable, possibly  assigning a
different value to it from time  to time.  The initial binding of  the variable
establishes the (temporary) ownership of that variable by the subroutine.

   Due to the subtlety of the distinction between binding and  assignment, some
people	have proposed  that assignment	be eliminated  wherever  possible.  The
Maclisp do function can often be useful in this regard.

   There  are several  program constructs  by which  a variable  can  be bound.
These will be explained after forms and functions have been introduced.

















Page 1-14			    ∪1-3.1			   March 3, 1979
			   The Basic Actions of LISP


3.2  Evaluation od Forms


   The process	of "executing"	a Lisp	program consists  of the  evaluation of
forms.	Evaluation takes a form and produces from it a value (any Lisp object),
according to  a strict set  of rules  which might be  regarded as  the complete
semantics of Lisp.

   If the form is  atomic, it is evaluated in  a way which depends on  its data
type.  An atomic symbol is a variable; it evaluates to the value to which it is
currently bound.   If it  is not  bound, an  error occurs.   (See part	3.4.) A
number or a string is a literal constant; it evaluates to itselF,   The special
atomic symbols t and nil are also treated as coNstants.  A constaft can also be
cReated by Use oF the quote special →←eJV↓iQJAYCYkJ↓←L@QEk←iJ↓pRA∪LApL~(~∧@@↓∪@→β&C∃↓β4{C5αLε2αε∀≠
≡⎇λ∧
=_hM<\p~αpr2vYw:⊂ 3peciFies  the Operation  t`∞AE∀~∃aKβ∪⊂⊗←-\V"b∧λ⊗v"
~G4λ≤Y-\8;Z-lh→3]9;]∞P⊂9h→qts,H0y3z[p¬`≥iL@Ai↑%aQC@ ∧ε␈ε↑,↔&N⎇a`hTiybn∂MyVN~hn0¬s @
←[JAαK9βS>yβC_λW6Hλ∀n8z8-D→S`→~yP@]QSGP↓S]GYUIJAi!JA]Jα≠↔OO∂∪d4↓∪?∂K∞k7'hpλ∧
|→0→_z4wg≤P⊂9jXt⊂⊂ \P⊂0y\tsw6Yw:⊂⊂_w2⊂⊂_ww24]4sw0[9R⊂_w2⊂#≥w1z4[wαEreberences, if	]QSG⊂↓iQJ@@?XL≡~;sD∧~<h∀λ⊃P~[1z4`/n which  IpεACεεfN\@λ∧∞≠h~~2@
MaKGRα3'π⊃αβπK≡αP,]]_kA~~≥4d∧→]0↔_z4w@.al c@9[a←G!iSO\α↓β'MαβS#∃αβ'.M
v"α/∩πz∩ 1Z¬∃↓∞&}|X;.P0`∩e be@Rαc@"π↑∧ε␈.@L⊂80y≤9P⊗@ as dipπiS]≥cS@OF+⊃β≠⊗{5β∞¬p≠.βyt@tiof	8⊂∩εL≡FλHαP	@4p¬`↔∂'+C↔Mbβ⊗|H⊂∩≡0p
p1J@9↓∧c'O@Hg]X⎇~-⎇\h⊃[y12`3pknD↓GY←πα#3Eβ&y↓βO,∧',πzz4[2yP (nλ
+|εFF. λ∞0∂g@e¬[[@'v9β&≥lw.∞|Pe@∧@

   A↓@≠@.βP`~~ww⊂⊂~p|@ "e e@Rβ##↔Hαβ¬βC⊗K7OM_
LT≥z~,≥λλ⊂∀\β diIKGiYβIβ↔b,∧'∂&≤-F*α/∩πελQP@,εpqd~w2V⊂λ1pv,e`λAαα↓βOW↔⊃↓#OF{@↔λλ∪≠y⊂⊃9]q97`5ti`≥
λR@⊃↓∧¬w$_ λ↓8¬`≥↓_∞FN}d∧ε&.i⊂L\α⊂1<CE1w`-p`∂gSβ#'?9αβ?2∧λ	N↓w1z4[w9P⊂_w2⊂⊂≤βpeC%CX@@α3?K↑5Bαε8≥Ff.D∧ε∞r∧λ	/∞≤Hλ¬∞z∪`9≤∧  f@9`λhα@⊃2↑892`3q`∪@?pq∩↓(∪;nz⊂9`5brs Ape @EUSYhAαC9βSzβS#∃∧¬F∞vx¬0⊂Yp¬,	chARβ!β'MαβC/O≤¬⊗⊗→(∪≠y
@∧A`↔∂,ε O&tλm⎇]Y →≤∧ hi@L∪@↔c∧ε'4~;]
T≤⎇0⊃≤αs  @	rAkgαK;≥β&C∀'∞x¬WεNβ→0→λ∀9r@$  parpλ@H≤α@$
SFK@~ε|≥⊗w~∞8\αr!nd c=SaCFβ#;↔O~βπQβ_{ .(⊂⊃@/pπhA∩αqβ∪↔↔+≡z;YdY8=∞↓y2yWαA
   Thdp¬J@@αK@~α∧λ,L~1~-⎇X;λ∧{{4
>~0~≡P⊂12Xpzy`$	 sp@∃GCCXAM@>ε-W4λλ⊂⊂\αe  ¬Gikβ1P∪DQ ~Zx62`-ende@⊂ACFAαC∩α∞Mε/J∞|G,(⊃@:[1z4@.l re→KeK≥
Kf@9α↓αS"(ε&*ε_∧h∀≤|⊂∩Xppv∧≤∧q`E o`4P∞7.⊗ λ@Xv62`$ a`≤Aα3@∨∞(∧@⊂≥t4q`( ic @U`∂.@→M↑H≥~
≡h≤~\αpo@&ε! 2αλ≥bε6>XλN⊂4`∪  permipte@⊂Aa↑~)P↔π8	(≥\ ⊂\αb`∪'∪πKd¬εw→<\∞=_=
≥yHλ
|β⊂ )↓Q`
βεε,w.n]jBπ∨λ	0⊃↓i`
@'_∧↔&Nβ{@⊂λ0∧i@&π!1β'w≠C↔π h ⊗yHλ↓0∂ll=kS@:∧pλ∞↓42P⊂≤βtandard↓A`>8	 2≤¬re  u`ic ASF@↓IK@O_∞&N⊗X@λ,8ε7@7(@@A%h∪@&α4ε∞g=qP@.≠p	@3ib`→J↓`∪:λLV-8π"Pλ0P9@0ecial f`∨¬4@AEJβπ9α(∂ππ∩@
M
8r⊂λ4qP 4he`≤@α∪π33,∧Bαε⊂→L←≤≤@↔α@
MOM`A←L↓aQJAα∪WπH
⊗Zw⊂9x→qtpvλ30∂@%5`
βεα,RεF≥lFf.@n8z0⊂[4∧`∩Aα∪eβSF)β∂?oβ'3↔⊂q↓αSF+d4∂∪∃β∞¬p≠.
9→1∧<h⊂~~2P0x≤90∂` ¬∪'πS*β∂?∪*β@⊗∞MG$≥~_-d_8h∀_p;
∧≥≠h∞M→(⊃Nzq1πβE
   @∨I!KdAieaKfA9H	↓β4εVv∨M→vw~≡&*εL∧⎇,.Kλλ∞⎇~8z∧
<h∩N≡⎇α0$∞⎇8\D∞z=~∧∧_(≠_y0	able

λ
∃≠¬aGP@LX@br\r∩α∩@@@&DZf\D$∩∩@@@@@AACOJ@DZbj~(_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃]k5EKd∪=L@ACIOk[K9ifX∪1Kqad0AoQS
P@ASL@AC\AKqaHAoSi @AB@↓mCeS¬EYJ@↓]k[E∃dA←L4∃CeOU[K]iLXAC]⊂A[CGI↑X@A]QSGP↓SfABAisa∀A←LAMaKGS¬XAM←IZ@Ao!←gJAIKgkYPASf@↓]←hA∧~∃mC1kJXA	khAC9←iQKHAM←e4vAiQ%fACY1←ofA∧@Eie¬]gM←I[CiS=]CXD↓isaJ↓←LAg∃[C]i%Gf\~(~∀@@↓π←]g%IKdAQQJAM=aZ~∀4∀∩∩∩@@@@@QA∧bAαd\\\A¬\R~∀4∀~∀@A)QJ↓KmCYUCi←d↓MSegPAKqC5S]KfAAi<AgKJ↓SLASP@ASf↓BAMk9GiS←8AoQS
P@AI∃MS]KLAB~∃MaKGS¬XAM←IZXAR9J\AC8AMgk	dXAB↓MKqaHXA←d↓BA[C
eF\@↓∪DAg<XAA%bAG←9gkYi∃HAC]⊂ASh~)IKGS⊃KfAQ=nAi↑↓ae←IUGJAB↓mCYk∀X@@A%LA]←PXAA5kghA	JAC\↓←eIS9Cer@↓McMGQS←\\A)QJ4∃gkD5MWe[LAαb@↓iQe←UOPAβ8@ACe∀AKmC1kCiK⊂X@AaI←IkG%]NA\ACeOU[KMiLXAC]⊂@AiQ∃\AiQ∀~∃IK→S]Si%←\A←α1α	βM→βπCεc'↔⊃¬#=βSF)βπK?+7↔nN2rα¬λ↔πεM≤6∂&≥⎇bεO4F/≡>-⊗⊗.D∧εNr∞Mε(h,mvff}⎇⊗v:∞8V∨&≥⎇brJ∧
FFO4∂⊗N.LN2αε∀
&/∨]JBαα∞=vn
	M↔∂ different from an atomic  symbol which happens to be the name  of an
array; such an atomic symbol is evaluated the same as any other atomic symbol.






















Page 1-16			    ∪1-3.2			   March 3, 1979
			   The Basic Actions of LISP


α3.3  Application of Functions


α   When a non-atomic form iq evalqated, the function speCifaed by That	Fore iq
combined with the  abgumentq spEcifiEd by thad	dkrmtk produc@∀AB@AYCYkJ8@A)Q%b~∃AI←GKgL@ASF↓GCYY∃H@ACAaYSG¬iS←\lAiQJAMk]
iSO\%SfAg¬SH@AQ↑AEJ%CaaY%KH@AQ↑AiQ∀~∃Ce≥k[K]Q`
(∀Ph!↓↓¬##∃β0¬↔.⎇λ∀nL<λλ
≥H_<∞
~8x.M9{@
≡h≥≠d∧_{`↔≥2y: phe Fqnction-specif@%Kd@AαK;C=∧⊂hVnXL>~;p↔_v⊂⊂ %xpreSqa`∨\$Qg←[∃iSK
β→↓β∂x¬f'8	t`.elq @
CYYK⊂∪B@A→c]Gi%←]CXAMOE4XRAα4∃Mk≥
iSO]¬XAKqAeKgg%←\ARβ→β¬αd¬↔>λ≠p⊃~2qz≥t4qdλ4yP)]<piZe` sO that Licp  can kno@X~∃@#|εrπ&tλ↔πεO∀εO"∞Mrε∞,}Vn∞β]≤edλ∃~T≤Y0⊗→yP3 /p∧AiQ%bAG≡αs[↔K_¬⊗}r∞⎇⊗f@λλ⊂LT→→4l>X∧q2Y∧@
after @QQJAieaKfA=H	β≠,s∂S'|sπ1β,πππ⊗↑:6N}n4εF∂lTε⊗.]`λ←≤≠⊂⊂Zw2r.
~∀@A)Q∃aJACIJAECMSGCYαceβS>yβC_∧⊂∩≤β of d¬`↔h0

≥{X;∧>≤⊂→→yyt`/n.  A `	C[	IB[JβCCK↔≤ε6N}aQ&O~⊂λ↓8¬`≥Fπ#'?≠∞aβ↔c∧ε&/∨=⊂Md≥z~,=λ≤t\z9R,↑h≤p↔Zp¬ vApiables which @¬aJAi<AEJA	←k@: h ↔εt

(_<L↑91 ↔≥9Rand s@=S@∃α0¬w,αyP⊂≥t4qdλ0y2P≥0∂ be evalqateD,  ONe  would ∃qaKεβ $SF)β≠x-W4≥≠hL<⊃ ↔→⊂⊂7gλ842P≥0q4`!b`	Kf8∪!QJ↓mC@3αPBαε|dπ&FT	F∂∨Dλ	M}XεP )pεβKgα+⊃βεα1P@.α42P≥0p@*α)β>dλ

(⊂<∞
α4q`]4p∂n↓←DAi!JAYC5EIB[∃qaeKβ≠@≡↓8πw.	A`≥r↓aeKεα#∪'h	`⊂_ε`∂e[LACeJ4⊃aeKβ≠↔+Qεπ∂⊗YH∞$Xπy p	QKRβ⊃βO'&)7.l`	,>≤kB(∀≠_;,,_+9/∞≤Y0→\β`∪@?p∧ε@LβwuyH44urNα~∧~(∩α@@@@@"`∧⊗n⊗L⊂λ¬(⊂⊃ c dR4⊂λ$∧Jβ⊗|[ _BE		λ f`∨e4d∀(HH%β~¬pM⊗h∧FEα@
   Here a _@Aα⊃1β
bβπ;⊂αβ⊃βε⊗)↓βSF)β@6≤∧Z,≤Xε2`3 po		JAE↑β+3⊃β&y↓βSF)β@6≥@
,↑hλ∪l↓⊂:42CA0q3]vrw:≤β λAεα3&X@λ∧∞α42P~∧a`≠↓⊗#¬.¬X<M≤8[∩\β ≤@@↓∪@→α∂!β¬↓∧6/⊗L≥⊗bεX`⊗Yw:⊂⊂≥42P #qrbe@9`∀,-⊗v&≥lrεyH⊂⊂H8πa@f↓aQJAα{;∃α_∞&.∞LXBε↔∀λ


<h⊂⊗_vq20Kp|8 2essi891αλ∧π>␈]H	∧Y" →Xpr4m
∃E∀A@∪πn∪∪¬7⊗{W;⊂p∧αα∧9@	,≡Xε 9 thiC ha`≠↓⊗#¬n←∞πε/>8
-⎇Hλ⊂∀\β a→`↔;∂&K?9↓∧εvFN9λ≤xq 8≥9FEfour¬`∨Wn+;@'5`λ∧
~⊃(≡≤∪⊂∀↓aadi@9XA←L↓iQJAα3G;∂&K?;πbβ↔cC⊗+@∨≡≥xD∞≠h3≠zq⊂!pguments
pr`∨IUG@↔M∧∧∩π⊗≥JV*ε(∞(↑X;∃,≡~;YdYx[&∀α⊂:4→w⊂3/p¬RdX↓C]HAβ##↔→∧∧f␈⊗β 	Wλ⊂*42H8εalue of
fo`%4fASF↓iQJAYCYkJ↓←@→β&C∃β←F{3∃β0¬w,+Hλλm|H⊂∩↑0p
ple( the valu`
A∨α1βC#*ββ?-QP@H!⊃∩αα∧¬αFF≥\&&
¬∩ε∩∀λλE∀h
¬⊃"C"M≡h
↔λ⊂*42H3:g1]4sw0[⊂⊂2`8pres@MS←\AUcCHAαK@~ε⊂∧π6/-∀π<∧p
pLe one shiCh  acc`AiLAao↑4⊂π?+7.β]≤d8π $↓`↔S,ε&w~∞Mε*π<PλM⎇Yλ⊂↔[2WεEβ@
   I`@A]J@AOIC]h@↓iQJ@↓KqSGQK]GJAWL@↓B@A`IS[Ci%mJ@A¬IISi%←\@Aα{C↔K∂#'?9b↓β←#y≠∀4+5+;∂SL¬vv∞β⊃/∞≤Y4n≤8πw~p|P "e de@MSG]CQK@AEd@VH↓β##↔9∧εFF*∞l⊗g9(≠l⊂:42H33y6CE

λ	αMapch 3, 1979	↓	    ∪1-3.#			       Pace 1-17
			   Maclisp Reference Manual
α


		    ((lambda (a b) (+ a b)) 3 4)

is 7.  Actually,

		    (+ 3 4)

evaluates to the same thing.

   The	second basic  type of  functional expression  iq the  subr, which  is a
program directly  executable by  the machine.	The argumefts  of the  fkrm are
conveyed  to  this program  in	a machine-dependent  manner,  it  performs some
arbitrary computation, and it returns a result.  The built in primitives of the
language are subrs, and the user may write lambda-expressions which make use of
these subrs to define his own  functions.  The compiler may be used  to convert
user functions into subrs if extra efficiency is required.

   It  is  extremely  coNvenient  to be  able  to  assign  names  to functional
expressions.  Otherwise the definition of  a function would have to  be written
out in full each time it was used, which would be impossibly cumbersome.

   Lisp uses atomic symbols  to name functions.  The "property	list" mechanism
is used to associate an atomic symbol with a functional expression.   (See page
2-52 for an  explanation of property lists.)  Because the binding  mechanism is
not used, it is possible for the same name to be used for both a variable and a
function with no conflict.  Usually the defun special form is used to establish
the association between a function name and a functional expression.

   Thus, the car of a form may be either a functional expression itself,  or an
atomic symbol  which names a  functional expression.  In  the latter  case, the
name of the  "property" which associates the  symbol with the  expression gives
additional information:

   A  lambda-expression  is  normally placed  under  the  expr	property.  This
defines an ordinary expr.

   If a  lambda-expression is  placed under  the fexpr	property, it  defines a
special form.  In that casE, the  first lambda-variable iq bound to the  cdr of
the form being evaluated.   For example, if foo is  a fexpr, and (foo (a  b) (c
d)) Is evalqated, then fOo's lambda-variable  would be bound to ((a b)	(c d)).
A second  laebda)variable may optionally  be included in  a fexpr(  It	will be
bound to A "bindingAG←]QKqhAA←S]i∃dDAi<AiQJAG←]QKqhA=H	βSF)β↔[∞cWπSL{9↓β|1βS#(h+≠?⊗i9↓↓E≠↔¬βε∨*⊂&&λ→[n⊂:42H22z0Zv9P'Yα biNdifg↓G←]i∃q`⊃β∧{';S-∪@~J#"APT_9lT+$'↓ "(∧∧λ∧l%VkHb↓⊃(λλ	\<Xz∧εhε_N[\FEα∧DDPλ⊂*42H!0q`)c Ac@QS←]f↓←DA→%' ~∀4⊂⊂∀	α↓α'→∧	β#πn∪∪¬7,πππ⊗↑>6N}d∧π>OMλ
⎇Y(∪≥8Y_%↑X8Z,≤Y→(∧
<h≤
L8y1∧∞9Q→.⊂⊂:4→P6pq\0π
@AeWaKIirXA%h@AI∃ISMKβ→βS#*↓↓↔∞≠K:$λn8z8-D→[`→~P⊂6r[:4wg→p⊂0q≠{2W   The h	C[	IBZ~ the  fsubr property, it defines a special  form.  A
subr-object  under the	lsubr  property defines  a subr  which	accepts varying
numbers of arguments.

   There are  some additional refineMents.   A lambda-expression  which accepts
varying numbers of arguments, called a lexpr, looks as follows:¬

		    (lambda n
			form1
			form2)

The  single,  unparenthesized, lambda-varaable	n  is bound to  the  number of
argumefts.  The function arg, descpibed on page 2-12, may be used to obtain the
arguments.

   Another  property  which resembles  a  functional property  is  the autoload
property.  If Lisp encounterq an autoload property while searching the property
list of a symbol  for functional properties, it  loads in the file  of compiled
functions specified  by the  property, then searches  the property  list again.
Presumably the file would contain a definition for the function  being applied,
and  that definition  would be	found  the second  time through.   In  this way
packages  of  functions  which	are  not always  used  can  be	present  in the
environment only when needed.

   An array may also be used  as a function.  The arguments are  the subscripts
and the value  is the contents	of the selected cell  of the array.   An atomic
symbol with  an array  property appearing in  the function  position in  a form
causes that array to be used.

   If the  function-specifier of a  form doesn't meet  any of the  above tests,
Lisp evaluates	it and tries  again.  In this  way, "functional  variables" and
"computed functions"  can be used.   However, it is  better to use  the funcall
function.  (See page 2-13.)

   There are some other cases of lesser importance:



March 3, 1979			    ∪1-3.3			       Page 1-19
			   Maclisp Reference Manual


   There is an obscure type of functional expression called a label-expression.
It looks like
			(label name (lambda (...) ...))

The  atomic symbol  name is  bound to  the enclosed  lambda-expression	for the
duration of the application od the label-expression.  Thus if name is used as a
functional variable this temporary definition will be used.  This iS  mostly Of
historical interest and is rarely used in actual programming.

   Another type  of functional expression  is the funarg.   A funarg is  a list
beginning with the atomic symbol funarg, as you might expect, and  containing a
function and a binding context pointer.  Applying a funarg causes the contained
function to be	applied in the contained  binding context instead of  the usual
context.  funargs are created by the *function special form.

   An expr property  may be an atomic  symbol rather than  a lambda-expression.
In this case, the atomic symbol  is used as the function.  The	original symbol
is simply a synonym for it.

   In addition	to the	variety of  application just  described, which	is used
internally by the  evaluation procedure, there is  a similar but  not identical
application  procedure	available   through  the  function  apply.    The  main
difference  is	that  the  function  and  the  arguments  are  passed  to apply
separately.  They  are not  encoded into  a form,  consequently macros	are not
accepted by this version of application.  Note that what is pasSed to  apply is
a list of  arguments, not a list  of expressions which, evaluated,  would yield
arguments.

















Page 1-20			    ∪1-3.3			   March 3, 1979
			   The Basic Actions of LISP


3.4  Special Forms


   This section briefly  describes some of the	special forms in  Maclisp.  For
full details  on a  specific special form,  consult the  Function Index  in the
back.

Constants

     (quote x) evaluates to the S-expression x.

     (function x) evaluates  to the functional	expression x,  There  is little
     real  difference  between quote  and  function.  The  latter  is  simply a
     mnemonic reminder to anyone who reads the program % including the compilep
     - that the specified expression is supposed to be some kind of function.
¬
Conditionals

     Conditionals cOntrol wheTher @=`A]←PAGKeQCC\A→←e[f↓CeJA∃mCYK¬iKHX↓IKaK9ISMN4∀@@@A←\AQQJ@AIKgkYQbA←L↓KmCYUCiS]≤@A←i!KdAMα{@⊗<k@∧
~≥<a≤Yx
4λ:42P≥0pe¬	afd↓iQJ~(@@@@↓c@'∪*β↔≠(∧7'~
x	D∞~→(={Y~.M8πw0[⊂3'@2i cAn be Cont`%=YP∪⊗ ¬`hPβ"B¬{{Q∧¬≤≤Y,M8x=T→S`→~XP#/p¬Rd\αq1%↓GβC↔∪L≠πS∃∧3?KP∧ 4πrm∩(∧\\R8X\R~(~)↓α↓↓β'~β¬β∨,¬f/⊗≥Dαε≡⎇lFO&≥xL≥λ⊃P↔↓p¬@∃9ααS#∃∧c'OS~↓β >dλλ$∞≤Y1
≤x9→$8π $Ag←[∀AM@?⊗kD4λα↓↓↓β∂∪∃β∞∧≥F@L9⊂⊃Z0ry`%pε@9↓¬##∃α_
vv"	_d9X;∞\=→1∧↑(⊂⊃≠w9t@$er`∪]≤A`∪#*↓β∂3∂+@≡8	P /ne~∀@@@A	r@A≡αs∃β'p↓βC#*β?K∪,ε"απMWJε_∧Y$∧≥xZ.Nα2`.8∪!QJAaeKα#'∂εαLRεyHλ∀λ⊂`⊗_zyrP~yBE⊂λ⊂⊂⊂%va`→↓(S↔⊂bβπ;⊂∧¬ε!=~→$∞Y<p~Z8∧ @Rβ→β@'(¬0∩⊂⊂:4_z⊂$@s, anything `∂iQ∃`	↓β&Cπ9α¬mεb`Q$ααα∧≥
8π⊂⊂≤42P&or`≠fAS@9∧εFF∞@λλ=_0~@se a@e∀@AKmα3@._¬→,D_;Y∧∧≥~→$y{@∩λ⊂4`∪ `
S@:¬⊂m9β"D∧λλλ∞|9~≠N≡λ⊃ ≤_tp	ning the re@5C@'h
 7_β c@XεWO↔~q↓α≤dπεFTL↑⎇;~λ4qP .ot  Q`@.UDεJY+C!⊂⊂⊂⊂λ4s⊂ )p i@&↓]S@0b↓β@&λPD∞α42P≠2|: cla@jπ≠∃β&α4αε/≥VNvX@λ
≥H≥~T≤x;,T≥x>%@∧P$@& a`→X4⊂	↓↓α↓β@&Tε≡f_¬ 9YyP y→P2|4_zyz2Y⊗⊂:4_z⊂$@3  noPAC@9∧W.Xπ`∩8∪!QJ↓mC@2αPRεyH⊂!≤{{Y∧
<c"D∧λλλ∞M→(λ∞l8ε ∃∧  of the  hactAM@>⊗iβ'PL+[πH¬ .L<kλ∧∞z~ ⊃Z⊂1w@uld  Be  nil  i_AU@<hQ↓↓↓αβCK↔&K∂πS*β'Mβ'∪W*@λn⊂:42H90v*YP⊂7@& a pRe`ic@¬iJARα1βC#∂!βCK,#'∂π&(''M¬#@↔∞QQ"αα∧∧ε↔∞D	ε∂~
mrε6β|[.∀~;@⊂~z9P![0rybKαλ
∧~(@@@@QC@; ∧ε&@|[ _H30∂rm2 foIP∃M9pq%β↔43Gπ&+@~πMRε6|-W
ε≥`π>8xp∩\βsio@8Ak@;&K1↓β}s∃β'_h!↓↓α↓β;πbβ?Iβ&C∃β~|ε&o~∧↔⊗*P∞
=<p~→r⊂And the result  is the valu`
A←_@AiQ∀AYC@∨ 4	↓α↓↓β≠⎇∪%β↔63@.≡LV"pQ!PRα∧∧ααF|$εε␈-P$Y|[&$→[`→≠YW↔↔
P2{ [8pz2\β the formq until one is non-nil  op∧AiQ∀~∀@@@AM↑β∪7M↓εK∃↓ε+c#π-≠S↔⊃b↓βπ≠ βS#∃αβK↔O.cA↓βM→↓βSF)β[πg+∃↓β|1↓βSF)↓β3∂≠Qβ≠⎇∪44)α↓↓↓β-3π3W∂#↔⊃_hP4
7∂∪∂!↓~a↓Ee;H$$%α↓↓MλiM9PHH%↓↓α↓↓↓αε∨∃↓
iID4P			   Maclisp Reference Manual


Non-Local Exits

     (catch form tag) evaluates the form, but if the special form  (throw value
     tag) is  encountered, and	the tags  are the  same, the  catch immediately
     returns  the  value without  further  ado.   See page  2-44  for  the full
     details.

Iteration

     (prog  (variable...) form-or-tag  ...) allows  Fortranoid	"programs" with
     goto's, local variableq, and return's to Be writpen.
¬
     (do ...) is the special form fop itepation.  See paga 2
38 fOp the details
     of prog and do.
~∃⊃KMS]%]NA
U]GiS=]f~∀4∀@@@@QIK→k\@A9C[J@QCeND@ACe≤d\\\$@AM↑IZb@A→←eZ∧8\\R@↓IKMS9Kf@A¬\@QS9iKeAIKiKH$~∀@@@AMk9GiS←8\∪'K∀AaCO∀@dZlDAM←d↓IkYX↓IKiC%Yf\~(~∃eI←dAπ=]ie←0~∀
∀@@@@!EeKC,A]C[∀AhRA
CkgKβ→↓	o⊗[CQβv7∃	¬#=β*βSgC.!β?W"βπ;⊃ε;'[↔~β∂?;'∪?1↓π#=β∧hQ↓↓↓αβK↔π"k↔[πbkCK'w!β3?␈↓βO=π##πQ¬##∃β/≠↔Iβ≡9β↔F7'≠*βπ;⊃ε≠#π;>)βS#*↓βOS∂#∃β?0h)↓↓α↓βS#*β←?Kf!9↓α>C↔9βF)β'Mπ≠πS'≡3'↔⊃bβS#∃π+O↔I∧∧6∞r8↔/≡T∞FF*.&.∞4∞Fzπ,↑G/⊗d⊂hR∧∧ααπl≥G.*d∧¬≡.T∞ε∞>Tε2k*mw∩πMRε&↑L⊗Ng4
v $_\Y,≥iC"AQHλλ∧∧
→4N∞y=λM|[*$=X;∞\=→<d∞~→(m|[#∧]=
≤H_;D<\[n$≠xpn↑\h≥
(→4N∞y=λ∞=;<≠∂⊃"Hλ∧∧λ≤Y.N<[\d
Z;D∧∩9H
mh→<N-|H≠l<⎇<\eD≥~→$∞X;≥,T~<h∀≠~<nD≥z≠n<(≤z-l{→(]→;9-nβ"H∧∧λλ~.∀≥z_.D≥~→$∞X;≥,T≠yH∞M→(→M}[(≥m};→λ
=Y(,9;H∞⎇=~≠n↑λ→<N.y=AQC"P.>z9{M\;]β!!"Hλ∧∧λ
≤l↑≤(≥L≡L(λ∞l;≥9&∀≥X<F$λ≥X-N9,KEeJ(_.>z9{N4≥~→$∧≥X;∞\<h≥
tλ≥~T≥X<M≤8[→.5C"H∧∧λλ∃
(≥X-N9<h≡Y(→M}[<h∞⎇~8z∧<Y(↑X;≥,≡→9AQC"H∧∧λλ
∞>≠|Y$¬_<\L∨(λ≤n\\x|M≡≥(∞>8\xn-<≥EeKJ(∞l;≥9%∀λ_<n=9{\d∞~→(∞l;≥9$∧≥≠h∞M→#"D∧λλλ≡\X>$y;≠∧∞y;→,>→9λ/(≤⎇,.x|Z.∞~;Yedλ∀y,T≤_<NDKN∧[|Hn<]~↑H~;Lm|[8.M;{C!$λλλ∧
{H_..X><ea"C"AQC"C!!"T_,|(+&&B""$∧λλ∧f∃,kM↓⊃"(λ∧	8<Xm∧kλε↔-n#! ↓A""(∧∧∃~→$λX<z,4⊂8⎇
≥{\h
|H∪∩*:β"C!!"S:.<y;≠≥Y;⎇.4∀_<L≥9=→..c"C!$λλλ∧¬≤⎇_.N<h≠L≥9(λ¬]|≥~-⎇X;λ≡Y|k%∀≤Y=∞↑[\h∧
:<xl]≠_;L]⎇<h∞<X;,↑→<\d∧≠yH	I4tAQHλλ∧∧≠X;,T~<h∀≠;Y-]{Z8d
X;9$[|H∞⎇_=λ
≡h≥≠dY(→
⎇Y+C!!"Hλ∧∧λ
≤n>_=≥.4≠X;,T;|∞M;{X-D_<Yn5*(≤l↑≤h≠-≡xy;
L;Y;n↑h≤_.,;9=↑\kC!!"Hλ∧∧λ∀y,T≤_<NDkMd[|H∞M→(→↑_:;∞4≠yH∞>_=≥.4_;Y∧∞|⎇_.N<kC!!"T≤L↑≥≡+*∞Z;]
≥Yc"AQHλλ∧∧
→|M≥Y→9D∂
(≤∞,=≥~-O(≤≤M≥]≤h∞M→(≥L≥≥9(≥Yλ→N]X⎇~-⎇H→→,m;Z=
≥{H

≤B8;O∃(≠yAQHλλ∧∧≥~→$=≠{-≤h≤}-\[{λ∂¬Hλ∩-l→;]≡~;{A≥<h≥.<9λ≥
t≤Y=L\;λ≤nN]8⎇∞↑Y+λ∧∞~→(∞≡;⎇→!QHλλ∧∧≤|→,=8;λm|[(
≡h≤Y.∞Y<y-n→9λ/(	k∧=_kD
y9(∞<]λεeLh→M}H≥~T→→=≥;≤kAQC"U∞,8z;Lq"C"D∧λλλ¬∞≤X8lT≠X;,U(_x.↑y<h∧∞~→(n;X⎇
≥{H≠L≥9(≥
q<≤Z-nλ_(
\<|x,|(≥z]Y=Y.∧λ~=∧
<c"D∧λλλ<;≠→,D_;Y∧∞z→;L↑Y<H
≡λ≤Y.N<[\edλλ∀l\(≤_,|(k&6(→[n$≥~→$
8;↑$∧→Y8.N<Y<d;Yβ!$λλλ∧
|≥~-⎇\h≠ld≥≤X,<+C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"S8.,zλeD.-g⊃""(∧∧λ∧l%VkMα!⊃(λλ∧∧λλ∀≤y(%VLc"@↓A""(∧∧⊃88mM<|λ
,9Y<L]Xy(	\;]8-A C"APLkM$∧⊂Z;LM;Y`λww:2↑8⊂(7~w:2y≤β


   There  is a↓special type  kf object  called a  bindifg↓G←]i∃q`⊃↓¬β?'≠&+I1β⎇⊂4O|¬V/&≥\W
ε≥`α,+;⊂∀\z⊂8'Zw:2iλ⊗⊂;t~qt⊂!Xw⊂12H8yr`$ to Reberpk a	bifding c=]iKqP~∧QBαβ@≡∞@λl@⊂⊂14[24w3\β of vabiables  a`≥λαβ[π∩αXW4≥z~,=λλ∃l≡h→0≤≥0s:⊂_z⊂⊂0H80q:~qzv \A4g≤z0w:⊂P":YP:7P≥42P9]0qu@ impl@∃[@↔nL↔&N⎇`λ
|β⊂&pXv4yh⊂0Pbindine cO9iKqh↓a←S]QKd4T¬↔4≠{[∂∀≥X;
≤λ≥z
≥→(⊂m⎇]_[mD~8h
l<⎇→,D≥z5

9H≥
(_Z-l~;Yd{{]←≥λ~.Dλ≠X-\αyWλ$zεE~yP77]⊂87i\tq62H⊂:7P→|4r⊂→αrom within a↓ESMI%]NAG=]aKqP@AEjβ!β/↔(εαεOD∧ε∂⊗βx
G→⊂14FB92z0Zw0w3H0P8'Zw:2iλ:7P$]↔αEεB⊂⊂⊂ H10w2~w3P![w:2|≤∧ po@%]aKdαβ'Mβ(¬↔&F↑ ε
εlX	l≡~=Y$X∧t7≥vP7`2 j`∪X8@A]S0A[KC9bAiQ∀~∀EO1←ECXλAWd@@C?αβ3↔[,¬B$λ_Z-l~;Yd{{]←≥@∧∧∃~→$
Y9x.M=Y(∧Z:≠N](~0→H⊂0P3peciAl	∃mα3G∃∧{∩ε≥↑εf.XXNL9~3mdλ→→.9Y→-nλ≠9,≥X;Yd∞z~ ⊃Z⊂⊂9d≠zv2_2P7@bta`∪]∃H@A↑αs3eβ4ε&}hQ ml(λ≠l⊂⊂:4→P⊂3 /ur  FolloWing Sourcepεdβ&C∃↓β4εVv∨M_mdλ→5L≥→\X-\+λλ∞M→(→N≥X⎇~-⎇C"@∩\αrframe, @QQJAgAKGSC0AMOe4@UMk9GiS←8XA←D↓iQJAMKG←]⊂AQC[	IB[m¬aSCE1JA←L↓BAMKaad\~(~∧@@↓)QJA=]YrAUgBAM=`AES9IS]Nαβ∂?;&+c@"∧
ε}NnLW↔~
≡2π&t
ε∂∨4
FF.T∞Fzα∞Mε*εnYf∨&≥⎇g_h,↑f∞b≥f"α≡πεg∀
Fzπ>V≡No∀απ&Tε⊗NlM⊗v:∧6}wL←π"ε≥dπ>F≤=ααπl≡&N∞-LW
ε≡,RαπMtε⊗(Q(W6∞N\↔&.D∧ε∞vA≤↔∨≡≤⎇fn.nN2αε≡,RαπMtε⊗*∧∞ε/⊗m}&n.D∧ε'/-≥f:α∞Mε∂"∧W6∞N\↔&N⎇dε␈⊂Q,↔πεM≤6∂&≥⎇brαλ-⊗v&≥lrε≡⎇nF/GD∞ε}NnLW↔_≤≡&*ε≥N6zπ↑<V"ε≥nF/⊗l≥FgJ∧'Jα,nVv∨M≥vrpQ*vF.d
↔"ε|]f/⊗≡LW~ε∀g.v≡,rbε≡Dππ/N4εNr∞Mε*εn]f∂⊗t∞FF*nVv∨M≥vv∞D∧ε/G∞,W∨≡≥⎇bεOAQ'>∂4vO6]dαε∞lDε
α-⊗v&≥lrε≡⎇nF/GD∞ε}NnLW∩αLW≡N⎇l↔&Nltπ&FT∧ε⊗NlM⊗v:]g6O-⎇fn.nAPV∨↑.&.wD↔"πMRπ&≥\RαVn]f∨&≥⎇bπ>≡4ε≡∞MLV"pQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ*ε∞>Tε∩k∪A⊃⊂Jα∧∧↓≠
V5c(H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃~ε∂↔Dε"αjλnVv∨M≥vr∧L↑6∨⊗≡∞FN}n1PPh!Q hPQ&∩rα
∞&.&≤<↔&/1Q hPQ$αα∧∀∧ππ⊗\M⊗≡∂LTεO~∧∩ε7]l7&N⎇a↔>F≤=απ&↑>G~αmw∩π=⎇V*α=vv&≡M⊗}r∧
⊗w6⎇NfNvt
↔'_Q,↔⊗?]\Vw"≥f"π,↑G/⊗n4π"ε≤dπ&F≡Dε≡}lM↔&N⎇dεO~∞N'.*D
w∩εm≥BεNd
↔"ε≡4εv␈D∞G↔.UaPPh$∧α¬&Q⊗6}MMw>Nltππ⊗\M⊗≡∂L↑2αε≡,Rε6}$αε≡\6↑Nltε&∂L∀απ'≡W~r∧∧¬&F↑<Rππ,\FN≡≡LW_h.,W'/-a↔"ε≤dαπ&]↔∩α≡&?.\]g"ε≡4αε}d∧π&FT∞GOεQ≥⊗v&≤<↔&.D∧ε↔J∞Mε*α
l⊗n*∧
v2πMPhVn]f∨&≥⎇bbα
m⊗bε≤dαεOD∧εO~
|bαπ=⎇V*α
}FF/$∞GOεUdαα∧m}F(OM↔"πMRαεl≥V(N|dεn␈>APWπ,\FN≡≡LW~ε]lG~ε≥dπ&FT
F/'L↑"παDλ'Jε=⎇g6.nM⊗}raQ hPQ,↔&}Q⊃∩αα∧
5,∃$ε∩ε∂,qPPh$∧ααα
Mε*ε≡Mvjπ∞,V&N<≡F*π,↑G/⊗n4εvND
⊗2ε≡N2ε∂,}Vn.nDεO~∀ε&␈NLV"o≥↔∩ε}$ε
εM≡7"`Q$ααα∧
wαπD∧εN2
≡BεO4∧ε∞w∀
6NvD
v2α≡F}n≤4ε}⊗,\7"π>\6Bα≡2ε

nVn⊗↑%Bαε∀λ6F∂,≤7&/!Q"αα∧∧π∨'-≥f:b
}"ε∞d↔&}]≤2π∨≥\&}baQ hPQ*7Nn-⎇GH∀∧αα¬8X%∩β∀λ↔⊗8Q!PRα∧∧α¬&Tπ∂N\-vgα∞∞&.&≤<↔&*∧∞&/'↑-g~πD
⊗2ε≡N2αε≡,w.n]nBεO4⊗rε≡MvnN4∧π∨N\-vbb
z hR∧∧ααεm→BεNd	↔"ε≡4ε∞w≡MεNvtVg≡UaPPH!Q&6O∞↓⊂Jα∧∧¬≥,*$β
ε≡,phPβ"H∧∧λλ∃
(→@∀↑8⊂⊂8≤2r4qXz2P)→z:y7≤P:⊂⊂~s⊂4j≤β  areumeNt is a  fIxjum↓←d@A∧AECO9kZX~(@@@@↓←iQKIoSgJ↓]SX\t if	its argument is a flonum, nil if  it is
     not.


bigp		    SUBR 1 arg

     The  predicate  bigp  returns t  if  its  argument is  a  bignum,	and nil
     otherwise.

March 3, 1979							       Page 2-1
			   Maclisp Reference Manual


numberp		    SUBR 1 arg

     The numberp predicate returns t if its argumeNt is any kind of number, nil
     if it is not.


hunkp		    SUBR 1 arg

     The hunkp predicate returns t if its argument is a hunk (see page 2-32 for
     a discussion oF hunks).  hunkp  does not consider list cells to  be hunks.
     This predicate does not exist in the Multics implementation.


typep		    SUBR 1 arg

     typep is a general function dor constructing type-predicates.   It returns
     an atomic symbol descRibing the type of itq argument, chosen fpom the liqt

	    (fixnum flonum bagnum lIst symbol string array random)
¬
     symbol means  atomic symbol.  list  maans a list  op a Cons.   array means
     array-pointer.   random iq  for  all types  that  don't fit in  any other
     category.	Thus numberp could have been defined by:
α
	(defun numberp (x)
	   (and(memq (typep x	 ' fixh
kZ↓MY←]UZAES≥]kZR$~∀∩∪PRR~∀4∀~∃)!JAM←1YWoS9NAio<AMk]
iS←]LA←]YdAKqSMhAS\↓iQJA5kYiS
bAS[AYK[K9iCiS=\\~∀4∀∩∃gQaS]O@∩∩@@A'+¬H@bACIN~∀~(@@@@↓)QJAMieS]≥`@AaIKISG¬iJAe∃i`↔Kw→βQ↓εK⊃β''→βπK?+7↔nA⊗O~⊂απ∨N-⊗v:DλnM→<]m≡y#"D∧λλλ
m;C!! C"N>8\\↓⊃(λλ∧
u0TDε(_<LQ"C"D∧λλλ
M→(≤n\\\λ∞∞Y9~,<=→(∞,=≥4Mnh≥λ
≤Hλ~.Nh_<L};93ND~<h∀λ\⎇,.HH⊂↔X52qz⊂⊂4W→W⊂0FB⊂⊂⊂⊂λ87tw≥2y⊂:≠P:42H6pqt~w2P1[r2P3≠y⊂0P_wvx4[2r⊂7\⊂9|y]2vP3≥w1z4[w↔⊂⊂⊃|0vx≠2]εEβEεE(_srP→Y∧DDH⊂⊂⊂⊂∧Y⊗XWαDDP⊂λ&py1Z⊂→V⊂\[\FBβ∧DDDH⊂(92Y4qpz→yFEεBεEεEαP⊂⊂⊂
9zq9≤⊂∀3r]⊂∪qp\⊂∪yzX9∀TP∂←⊂:εBεEεE∃42P3≠v67{Zw3P0\2P0@≠wy2P≠tyqr[40w2[zyP9Yz⊂7sλ892r~qpz2\WεEεBεE2xBDP⊂⊂λ)ja)λ→⊂0y→yFEεB⊂⊂⊂⊂λ∀2xP≡⊂<TP∂←⊂:⊂~s⊂<⊂λ0w2≡P0y2H2|0q]6<P:~2P9p[rP7q~2qz⊗λ74v⊂λ7z42\9tyrH∀1s↔βE⊂⊂⊂λ⊂2xzXv∀Wλ⊂$z⊂≤t7zv→⊂⊂12H77z2Y⊂⊂:4_z⊂⊂:~4w3yH:40zλ⊂894[:⊂:4→P⊂9p[rDpy→P77zβE⊂⊂⊂λ⊂72qYyypy~v<P2\P:7P→pqt⊂≠z42y⊂⊂$wλ80y:~qzv0\⊗⊂7:[q2y9H;tz4λ:42Pλ9pvrH;0v:YFE⊂⊂λ⊂⊂72Yr⊂77]⊂12P→xV⊂0[2⊂:;[P9tvZv0y⊂≠4yz9H0y2P≥yzpv≠<P77]⊂2xWαdw⊂3Yw2y0[⊗⊂:;[FE⊂⊂λ⊂⊂0z≠vtqP≤|vq7[9P;t]4⊂⊂:~2P9p[rP89~w:⊗w_vrP0\2P⊂2\V⊂1:]⊂4z⊂~yP⊂8≠yytq≠2P;t]4εE⊂λ⊂⊂⊂6Xuw0vH7y⊂6]v:4x≠2P7q_y90|\P:7P→rw2y_z2P9↑vq7v≤P;t4Xt⊂40]2P:4→P9pvYP894[:⊗FEλ⊂⊂⊂⊂≠0vrP_:z⊂0\2P77]⊂2xWλ⊂"|0[x62yNεEεEαDT2xH∪pP∪X∀P≡←λ74vεB∧DT2\P∪pP	pTP≡O⊂:εEαDT2xH∪T0P⊂1∀P	T0P↔λ1∀TP∂←⊂74[⊂∀:y]pv6<JFE∧DJ2xP∀_ww9P	pP∪q
P∀1w[9P∪pH∪q∀TH≡←⊂7~v⊂∀0[;p|yJFE∧DJ9rz8H<⊂∪T_P↔⊂1
TP∀2\P<⊂<
P≡←⊂≥⊂9tw_rP4zλ4yFEαDDP⊂λ⊂⊂:4→P9pvYP1wx≡P7s⊂
0P↔⊂_∀P4wλ17z4λ0y3z[rw:9KεE∧DJ9rz8H<⊂∀9Yz8P<H_[TTH∀2xP≡⊂<TP∂←⊂:⊂≠y⊂74[εE∧DBP⊂⊂⊂λ⊂22x→w24w→P7w⊂≥42P4[x62vYw:0z~ww↔∧VwzP1XwεE∧BDP⊂⊂λ⊂⊂72]2y⊂9→v<P7[⊂7:vX2y9P_2tw3H2xWεBεEεE→xzpvαDP⊂⊂λ)ja)λ→⊂0y→yFEεB⊂⊂⊂⊂λ*42P→xzpvλ892r~qpz2H⊂92z≥y79P≥⊂4s∧Zz9P0\3zvr[:9P0\2P⊂9Zvtv0\⊂∀4y[vwy8~4qTFB⊂⊂⊂⊂λ7q52Xz9W⊂
1s↔⊂→xTDj≥wP7:[q2y9H0y2Pλ2xzp[⊂4s⊂≥42|DZ0{2P≥42P9XvrP⊂≥0v:rH∀0FEλ⊂⊂⊂⊂→67w:[P4yP≠2{2yλ2xzp[⊂:7P_P34|≠:vP:~7zst
W⊂⊂*≥wP9z≤4w3yH0y2P→xzpvαts⊂:~2|FEλ⊂⊂⊂⊂~0{2P≥42P9XvrP6→w3z4⊂0w2λ:42P_t0y0Xz2y9H1wvx≠ytw3H:42vH0y2P≥42P9XvrW⊂λ v6εB⊂⊂⊂⊂λ7z42\⊂0z7[tqP7X52qz≤P⊂0y→P2xzXv⊂4sλ⊂0w2λ7w6<H4s⊂⊂≥42|P_y2P2\W⊂⊂⊂⊃7y⊂2≠z:2rβE⊂⊂⊂λ⊂80t\9P0w→⊂64y]9V⊂ %qual is dedineD recursively as the tso Car's being equAl
α     and the two cdr's being equal.  Thus equal could have been definedby2




α


March3, 1979∩∩$@@@@&dZb8∩∩∩∪ACOJ@HZf~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∧~(~∀
∀$@@@@!IKMk8AKck¬X@Qp↓rR~∀$∩Q←dQKbA`ArR~(∩∩@@@QC]⊂@Q]k5EKe`↓pR@Q9k[EKI`AbRQUk[∃ckCX↓pArR$~∀∩∩@@@Q¬]H@Q9←h@Q¬i←ZA`RR~∀$∩∩@Q9←h@Q¬i←ZAdRR~∀$∩∩@Q∃ckCXQGCd↓pR@Q
CdAr$R~∀∩$∩@QKEkCX@!GIdA`R@AG⊃dArR$RRR~(~∧∩@@ASL↓iQKe∀AoCF↓C\ACUqSYS¬erAMU]GiS=\AM←HA]k[∃eSFA∃ckCY%irt~(~∀∩@@QIK→k\A]U[Kck¬X@Qp↓rR~∀$∩@AC9H@QKD@QisAK`Ap$@QisAK`Ar$R~∀∩$@@@@@QuKI←`@Q⊃SMMKIK]GJ↓pArR$RR~∀4∀@@@A)QSLA]k[∃ckCXAMk]
iS←\↓Sf@A9←hAi!JAgC5J@ACLAiQJA≠CG1Sg`A9k[Ke%F[KcUCYSid~∀@@@AMk9GiS←8X@zX↓EKGCUgJAi!JAYCQiKdA=]YrA
←[aCIKfA]=\[ES≤A]k[	Kef\4∀~∀@@@AβLABAG=]gKcUK]GJ↓←LAi!JACE=mJ@A⊃KMC]%iS←\0AShA
C\AE∀AgKK8AiQCP@AKcUCXA]∃KH~∀@@@A9←h@AQKe[S9CiJA]QK\@↓CaaY%KHAi<@AY←=aKHA1Sgh@↓giek
i`↔K*q↓α'r↓βπ∪&KS'?raβ↔DhQ↓↓↓αβπ3←∂KM↓βNkC3'/→β↔G,∧⊗br∧∧∧∞r
_NN8∧z4]2P⊂2→s4w4]4ww≠q⊂⊂2\zpv⊂
8πhi@
P@ASLA]← h)↓↓α↓βGWLεF*ε=z'ε.>E∩εO4∞FF∂@∧π'≡t	v⊗V\:G4_<Y$<=0-Dλ~1D∞~→6$
≠{zd∞~→(∧∞x;9$∞z→;AQHλλ∧∧≤≤Z-n→9
}=C!! C"Mm⎇α"$∧λλ∀jXTH$<Yc!! Hλ∧∧λ≠[nD≤Y=∞≡Xπ9P≥⊂4s⊂~z9P0\3zvr[:⊂4iH74v⊗λ7z42\;tybH70v↔βE

julL		    SUBR 1 are

     This is  the sama as  not.  Both  fqnctions are provided  fOp the	sake of
     clarity.  nudl qhould be  useD to Check if  something iq niL afD return a
     logical Value.  noT should be qsed to Invert the sanse kf a logical Value.
     Even thou`∂PA1Sg`AUgKfA9SXAi<AeKaIKgK]PAY←O%GCX@	MCIg∀XDAs=jAgQ=kYI\≥hA[C-J~∀@@@Ak9IKegQC]IS9NAs←UdAae=OeCZ↓IKaK9HA←\↓aQSf8@A
←HAKqC5aYJX↓←]JA=IiK\↓oeSi∃f~∀~(∩QG←9H@PQ9←h@Q9kYXA`RR@\8\@R~(∩@@@@@P@8\\@R$~∀~∀4∀~∀~)!COJdZh∩$∩@@@@&dZD\∩∩∩@A≠CIGP@f0@brnd~∀				  Predicates



	rather than

	(cond (x ... )
	      ( ... ))

     There is no loss od  efficiency since these will compile into  exactly the
     same instructions.


   See also the number predicates (page 2-65).

































March 3, 1979			     ∪2-1.				Page 2-5
	↓	   Eaclisp RefeRence Manual	α

~∀4∀∩∀~(~∀
∀4⊂α∧~(~∀
∀4⊂α∀~(~∧4Ph($(hP4λQ!PP"C"AQ@εEεBEεEβE

λ↓α

α~∀4⊂α∀~(~∀4Ph(∧(hRCπ∨*↓I5XHH%↓↓α↓MIhε∩`H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃⊃∩¬&T∧/6≥NV∂&}!PPH!Q hPQ&"rα
Mε*∧↑l⊗g.≡Mw⊂λ!Q hV↑l⊗`H∀∧αα∧J:T∃∩∧∀ε␈∩ε ε∂⊗}1PPh$∧ααα¬W6∞D∂αJα↑f∞g\≡F/~∂¬Bαε≡4ε
εm}&jb∧↔&}]_2ε␈$∧ε␈&↑'>O<UBε∞l@απ⊗↑NW⊗w4∞FF(Q$ααα∧∞&/∨]NBph!Q"αα∧∧αF/l≥BπB∧∞αJε↑l⊗g.≡LW~π∧∧εNr∞Mε*ε=⎇g&/∞Dαπ∨\6N6≤\Bε↔∀∞FF(≤-⊗v&≥lrε≡⎇nF/GAQ"αα∧∧πε}≥nF/∩∞¬bα∧←⊗oεLW hPQ!∩αα∞<W'
∂∧β#~mvzα|,↔∩HQ!∩αα↑f∞b¬
FO∨D∧v≡}n4πBα|mvzJ⊃Q Jα∧∧αααπWbαCF4αrε,≡"Hh!Q hV≡∞εgH⊃∀ααα	J5,∃$ε"ε␈$ε2ε∂,}0hPQ$ααα∧¬ε∂π
O∩ε2∂∃∩ε∂∞
FN/4∞FF*nVv∨M≥vrαdπ&z∞Mε*εM≡7"ε|dε∂⊗}]V.wN4πJr∧∧¬.vL↑7~εaQ"αα∧∧εO~≥bε7>\'∩ε}$ε6/∞∞"bπ>\6Bα≡2ε≡⎇lBε␈$⊗v"D∞vFN=∧ε/6≥NV∂&↑4αεON4ε∂⊗}]V.wN1PRα∧∧αεNd∧ε
εn]fwJ∧∞v∂JA≡FF*≡&?.\]g'~∧
⊗rπMRαεM≡7"α∂∀ε∂⊗T∧π/≡\Dαπ>≡Mε␈/D&.NlqPRα∧∧αε/l≥G.∂L\Brαλ←ε∞o
LW≠PQ!PPJ∧∧ααG<↑G
εd∧rZJ¬↔πεO∀ε2αuε∩β∩ε5∩JβWdβ0h!∀ααα¬∞6/'∀bα:U∀αF∂∞
GJεd∧rC
ε$β~J∀πSrαVAPPJ∧∧ααF≡∞εgJ∧|6}w4∧rBB4ε"β~∀εBJJπW`hP⊃∀ααα∧¬αBZε$β~J¬dβ"J
mw"αεTαrβE⊃PPh$∧ααα¬↔πεO∀αε0∨∀απα∀∞v␈⊗>4αεf≥<Rαε≡∞εgJ∧∞vO&∧∞G>z∧↔⊗?]\Vw'4∧ε/F<↑π"α∞Mε∂"∞Mε(h$∧ααα≡πεf≤<↔&N⎇dεO~Mvv*∧∞vO&∧∞FF*∞l↔⊗N≤-F*α-⊗v&≥lw~π>V≡Nm≤V"ε/∀απ&Tε⊗NlM⊗v8Q$ααα∧6}wL←π"π
⎇⊗w&↑$παpQ!PPh.≡V␈&Q⊃∩αα∧λe≥,*!PPh$∧ααα
Mε*π>V≡N≥Dε6␈-TαG∂]}F*π¬∀π⊗/NZ&w~∂∧π>OM
w/"∞N'NNltπ&z↑f∞g\≡F*ε≡Ebαπ≡]w&(Q$ααα∧
↔~α∞↑6."∧∞Fzε≥l6g.LTαε≡⎇n7&∞nN2αε≥dαε
mw⊗jd∧α∧6}$αε≡⎇nf.v≤]f≡*D∧π&FT∞&.∞AQ"αα∧∧ε7.l>FN}d
f␈⊗\≥FgJ=vw6↑.G~ε≥o∩¬~\←ππ⊗↑>6N}d∞π⊗.<\F."/∩π&Tαε∂
}7'⊗}
ε*ε}!PRα∧∧αε∞>↑F*ε≤<6.wD6F∂,≤7&/$¬α:J
→g&z∞Mε*π≡]w&*∞>ε.≡≤≥Bε6}-Rrαλmw∩ε←⊗oεLU@hPQ!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀ααα∧α3∩k%a⊂HH~⊗>*ε%S8h `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hPQ!⊂Jα∧∧αG≡↑N∩πB∧uπ≡}\TεfO>E∩Hh!Q"αα∧∧εO~=vw6↑.F."/∩π&Tπ⊗.≤LW∩πMw hPQ!⊂Jα∧∧αG≡↑N∩πB¬∞↔.␈LTαG≡⎇\Rεf≡>BJJ⊃Q hR∧∧ααπ⎇
⊗≡B∞⎇ε.r↑f∞g\≡F."<↔/≡↑4π&FT∞f∂⊗≤≤&f*∂∧π&z,Rπ≡↑Dπ&z∞Mε*α=vw∨L≥g"εM≡7 h$∧ααα∞l⊗g.T∧π≡F}⎇brαλmwαα
]w⊗*∧
⊗v6}-V∂&≥⎇bε}d∧εNw∞↑Bπ∨≥nF∂BD∧π≡.T∧π&FTF/&≥≥F. Q$ααα∧FO≡>↑7≡N⎇dεNr∞↔↔"εUc
pQ!PRα∧∧απ∂]}F*ε=}Vf"
↔6*,V.rLV6Nl\Bε↔↔!PPh!∀ααFL\g.r∞≡V␈&Tf/G∞$αGB∀¬ε≡∂$αJHQ!PPh,nVv∨M≥vpJ∧∧α∧5:X%⊂h!Q"αα∧∧ε7.l>FN}d∧εO~∧
FN↑T∧π∂.}LPN/<Wπ ≡Mε∂"∧
↔'~∧↔⊗?]\Vw"∧
↔~α∧∩αεn]f∨&≥⎇f∞`Q$ααα∧WGπ,↑7≡N⎇ebα¬Mtπ&FT
⊗w&↑.π⊗/L↑"bπ≡]w&*≥f"εn]f∨&≥⎇bε∂,TεN&]nFN≡≥EBε↔↑Dπ&FQQ"αα∧∧ε≡}↑
⊗f/$
f..N4π&z,Rε∞-LPO&tFO∨M≥f?.≡=αε⊗↑Nv..d∩π⊗≥lF}j∞
⊗.≡T∧ε}2L↔&
AQ"αα∧∧π>F≤=απ≡
}Vf",Rεf\nBε∞M⎇f*b≥f"ε∀λg.v>M⊗}rD∞vFN=∧π≡F}]F"ε,Tαε≡⎇↑εNf\@εNwMqPRα∧∧αεn≤=εNvT6}&Udα∧/≥WεfU!PPh!∃εn∂<↔∩αnVv∨M≥vrα
L⊗n⊗L∀αGα∞∃⊂hP⊃⊃∩αα∧∧αF≡⎇lBαB↑∩πα∧u"Jπ∃⊃PPH⊃⊃∩αα¬∞BαFM≡7"π∧∧sjπ∃∃∩αJ∃⊃PPH≤m↔↔∨E]FO∨E]v2oM
⊗v?1Q HJ9voπ↑LRn∞mzFF/%]FO∨E∀αHh!Q"αα∧∧ε≡∞MN2εn≡6∂∩∧∞vO&∧∞FG⊗\Tαε∂,}Vn.β]≤eD≥~→$∧→Z4N>λ≠yD∧≥z~,=λ~<d∧≥~→$];XnM;{C!$λλλ∧→9R-l9λλ/(λ≥
(≠⊂-\Y_+,←≤≤Y.>z;{Edλλ∃
"88nN8;λ∞l;≥9$∧≤_<n<9λλ∞Mh≠8.x8C!$λλλ∧→<→-l≤h≠md≥z→.M→<H∞M→(→M}[(~≡h_Y,]H_{m↑~;→,EHλ∩,d~=λ
≡hλ~-n→<\∞,=→9¬D≥~→!QHλλ∧∧≠_;,,_+9/∞≤Y<n=;{H∞}Z=≥]B88M}Y(≥m≥≠λλ,(≤_.>y9βA→9Hλ
≡λ~<d∧_{s.
;→9¬D_;C!$λλλ∧==≠m\=~8l≥≠≡+,|;Y<L≡→9λ∧=≠{-≤hλ≤o≥8[{∧∧≥z=
∧≥~→!≤{{<
≥→9λ∧{y→!≤[|H∞M→#"D∧λλλ
L;8Y∃9>≤∞,<|z-⎇H_<d
=≤h∞>8\H∞∞[|→..≡(≥m≥≠λ_LT≤_<n<9H∧
~→(∞↑⎇8;∧∞~~;Lt≥≠c!$λλλ∧≠h≥m≡~λ→N]X⎇~-⎇X;λ≡Y⎇;,]]≤h
≡h≥≠d
;][m<(≥~](≥Z,∀_<≤
O(≠|D];Xl≥≠λ∞⎇~8z↓QHλλ∧∧_8xl↑≥λ_M}~λ≥
(_{m↑~;→,D_;Y∧∞~→(
≥]→<N∞Y=→,D→];L>~;{L≥λ→[n-<kC!!"Hλ∧∧λ→]-l⎇~;md≠8:l↑h≠[d=≥→-↑≥λ≥
t≤{{∞l(≥~TλY]-l<Yh∞∞[x[]+HH∧¬Y];L>~;{D∞z≠⎇-Lβ"H∧∧λλ_LT≥<y,D→[|D∞~~<d∞≥<\
}y+C!!"C"AQT_9lTK.↓⊃"(λ∧∧λ∧lEVKB"!∀λλ∪,≡Xzλε5λ.&w#"@↓A"""$
~→(λ↑X;≥,≡≠|C!!"C"E,];XnM;{B$∧λλ⊃J:0TC!!"Hλ∧∧λ∃~T≥X;∞\(≠yD¬
Y]-l⎇~;md→J(
≡h_(∧,];X.,hH≠ld≥~→$];XnM;{HeHλ⊂$∧→];L≡Yh_l≥C"H∧∧λλ_LT≥<y,D≠~:lT_(→N]X⎇~-⎇KHλ	≡λ~_.4≥~→$9→~.M;{X-D≤≤[n<]≡$∞~_=∧∧~=λ={]_-≥\c"D∧λλλ∀_Z;LM;Yh={]→/∞α<≠m≥]→<D∞{h≥
=λ≥
(λ≥L≥≥9<d
yH≥L≡Z88ML<h_.,(λ_M};Y∞M→#"D∧λλλ∞<;9(N<Z;Lt≥~→$<≤∪
≤x=~-⎇H≠yD∞~→(∧];X.,h_<d=λ≥
(≥~-\(~=∧∧≥x<d|Y8.L9β!$λλλ∧∞≤[⎇M≤→9λ∧∞~_=∧∞~→(∧Z;Y
≥Yh→-nZ<[mm9;]∧∧~;H∞⎇~8z↓≡~→(n;X<Ltλ≥x.4_|Y,≡→9β!$λλλ∧∞⎇~;
D→>~.>≤hλ
⎇H≥~Tλ≤⎇≤zkH	;Xy$∧~9Hm{hλ
≡h_(∧];XnM;{H∞M_=∧8xq.∞≤h_!QHλλ∧∧→];L>~;{L≥λ_<L};93NEλ≤⎇,=λ_<aQA"B$∧
→→,n;H→M⎇h
→E⊃"B(∧∧λλλ¬<≤→-lλ≠{LU=X;∞\(
→D∞~→+-}~→<E↑X;≥,U(
*!QC"B$∧≠|K∧Y=≥↑C"C!!(λ
L9];D[{h¬J#"A∀λλλ∧∧
_<∞;Y
⎇Y+=L≥≥9(¬];Xl≥≠λ→D∞~→+-}~→<E↑X;≥,U(
*!QC"B$∧≥~→-a"C"A∀λ
→M⎇h

LN;Xu
≥{H_L≡J*#!!"B(∧∞{|Zn5λ_].A"C"A∀λ
→M⎇h
≤∞-yh
∂∧≡(⊗E⊃"B"$∧
→≠d∞{{9.M~;Ye⊃"B"$∧
≤Y.N<[H¬¬Y];L>~;{DX<J¬∀λ*#!!"Hλ∧∧λ→≠l↑h≠[nDλ~9DX<H∧
;]→-l≤h≥
tλ≤Y,l<Y;L<(≥~Tλ≤≤M|h≥X.-88[↑hλ≡¬D≡+λ∧9Q⊂≡↔εE⊂λ⊂⊂⊂∃→8s1j~ww⊂4\β intended to Help solve the "funare problem  hoWever	it only~∀@@@A]←eWf↓S\Agses.	Funargs generated by *function are intended for
     use as functional arguments and cannot be returned as values of functional
     applications.  Thus, the user should be careful in his use of *function to
     make sure	that his  use does not	exceed the  limitations of  the Maclisp
     funarg mechanism.

     It is possible to assign a value to a variable when a previous  binding of
     that variable has been made  current by a funarg.	The assignment	will be
     executed in  the proper context.	(This has not  always been the	case in
     Maclisp; it is a fairly new feature.)

     A funarg has the form
			(funarg function . context-ptr)

March 3, 1979			     ∪2-2.				Page 2-9
			   Maclisp Reference Manual


comment		    FSUBR

     comment  ignores  its arguments  and  returns the	atomic	symbol comment.
     Example:

	(defun foo (x)
	    (cond ((null x) 0)
		  (t (comment x has something in it)
		     (1+ (foo (cdr x))))))

     Usually it is preferable to comment code using the semicolon-macro feature
     of the standard input syntax.  This allows the user to add comments to his
     code which are ignored by the lisp reader.

     Example:

	(defun foo (x)
	    (cond ((null x) 0)
		  (t (1+ (foo (cdr x))))     ;x has something in it
	      ))

     A	problem with  such comments  is  that they  are discarded  when  the S-
     expression is  read into lisp.   If it is	edited within lisp  and printed
     back into a file, the comments will be lost.  However, most users edit the
     original file and	read the changes into  lisp, since this allows	them to
     use the editor of their choice.  Thus this is not a real problem.


prog2		    LSUBR 2 or more args

     The expressions in a  prog2 form are evaluated  from left to right,  as in
     any  lsubr-form.	The  result  is the  second  argument.	 prog2	is most
     commonly used to evaluate an  expression with side effects, then  return a
     value which needs to be computed before the side effects happen.
     Examples:

	    (prog2 (do-this) (do-that)) ;just get 2 things evaluated

	    (setq x (prog2 nil y	;parallel Assignment
			   (setq y x))) ;which exchanges x and y

	    (defun prog2 nargs (arg 2)) ;a lexpr definition for prog2


Page 2-10			     ∪2-2.			   March 3, 1979
				 The Evaluator


progn		    LSUBR 1 or more args

     The  expressions in  a progn  form are  evaluated from  left to  right, as
     usual, and the result is the value of the last one.  In other words, progn
     is an  lsubr which does  nothing but return  its last  argument.  Although
     lambda-expressions,  prog-forms, do-forms,  cond-forms, and  iog-forms all
     use progn implicitly, that is, they allow multiple forms in  their bodies,
     there are occasions when one needs to evaluate a number of forms for side-
     effects  and make	them appear  to be  a single  form.  progn  serves this
     purpose. Example:

	  (progn (setq a (cdrfrob)) (eQ (car a) (cadr a)))

	  might be used as the antecedent of a cond clause.

	progn could have been defined by:

	(defun progn nargs
	    (and (> nargs 0)
		 (arg nargs)))


progv		    FSUBR

     progv  is a  special form	to  provide the  user with  extra  control over
     lambda-binding.  It  binds a list	of variables tk  a list of  values, and
     then evaluates some forms.  The lists of variables and values are computed
     quantities; this is what makes progv different from lambda, prog, and do.

		 (progv var-list value-list form1 form2 ... )

     first evaluates var-list and value-list.  Then the variables are  bound to
     the valuas.   In compiled code  the varaables must  be special,  since the
     compiLer has no way of knowingwhat qymbols mieht appear in  the var-list.
     I`Ai=↑AMK\AmCYUKfACIJAgkAaYSK⊂XAiQ∀AeK[¬S]S]≤AmCe%CEYKLACeJ↓E←k]⊂∪i↑A9SX\~(@@@@↓∪@→β&{=β7∞seβ[∞cW/4↔⊗*∞>WπεM≤V"b∞Mε*ε←6/∨4∞f∞g\↑2ε∂,TεN>m}&."aQ h∩∧∧αα∧≤nF/∩∧
FF*∧∞f∂⊗α88ML<hλ
=Y(∧Y90↔αq7z@Nd  to  the	values$ the  fcrms are
     evaluated,  and  fInadly the  rariable  bandings are  undoNe.   The ResulT
     retqrfe@⊂ASfAQQJAm¬YcJA=H	βSF)↓β3∂≠Qβ≠⎇∪52∧	f␈&T
FF∂Dλ

(λXM|≡ @⊂≠qp@ prggv
     ic pπC@7L¬F∂∩∞Mrπε≡Bε↑d
πε↑⎇`∧
Yp~≤40`∀↓←DAaI←F\~(@@@@↓qC[AYJd~(~(∀TkπK∂@∧β~Bε⊂∞&W ∧DDλ⊂⊂⊂⊂∧Y⊗P∩.		↓@@@@@↓!COJdZbb4⊂_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀~∀$QgKiDAB@O→←↑ADOECd$~∀~∀$Qae←≥l@QY%ghAB↓D@OD$@QYSMhADRQYSgPABAD↓M←↑A	CdRR4∀∩@@@z|@!M←↑A9SXAE¬dA]S0R~∀~(@@@@↓	ceS9NAiQ∀AKmC1kCiS=\A←L↓iQJA	←IrA=LAiQ%fAae=OlXA→←↑ASLAE←k9HAi↑AECd0AECd4∀@@@ASfA	←k]H↓i↑A]%XXAD↓SfAE=k]HAQ↑A]S0XAC]⊂ABAe∃[CS]LAE←k9HAi↑↓M←↑\4∀~∀~)CeN∩$@@@AM+¬$@DACeN4∀~∀@@@@Q¬eNA]%XRX@↓oQK\↓KmCYUCiKH↓IkeS9N∪iQ∀ACaa1SGCi%←\A←_@ABA1Kqad0@AOSYKfAi!J~∀@@@A]U[EKd↓←LACIOk[K9ifAgUaaYS∃HAi↑↓iQCh↓YKqaH\@A)!SfASLAaeS5CeSYdABAI∃EkOO%]N~∀@@@A¬SHXAMS]GJ↓YKqaIfACYM↑AeK
KSmJAiQK%dA]k5EKdA=LACe≥k[K]QfACf↓iQJ@↓mCYk∀A←L~(@@@@↓iQKSHAYC[	IB[m¬eSCE1J\~∀4∀@@@@QCe≤ARRX↓oQK\↓KmCYUCiKH↓IkeS9NAiQ∀ACaa1SGCi%←\A←_ABAY∃qadX↓OSmKLAiQJ↓mCYk∀~∀@@@A←L↓iQJA$OiPA¬eOk[∃]hAi<AiQJ↓YKqaH\@AR↓[kgh↓EJAB↓MSq]UZAS\↓iQSf↓GCgJ8A∪hA%f~∀@@@AC8AKee=d@AS_AR@A%fAYKMf@Ai!C\@b↓←d@A≥eKCi∃dAiQ¬\@Ai!JA]k5EKd@↓←LACIOk[K9if~∀@@@AMkaaY%KHAi<AiQJ↓YKqaH\~∀~(@@@@↓qC[AYJt~(~∀∩Q⊃KMk\↓M←↑A9CeOf$@@@@mIKMS9JABA1Kqad↓M←↑\4∀∩@@@Qae%]h@Q¬eN@d$R∩@@@wae%]hAi!JAgK
←]HA¬eOk[∃]h\~(∩@@@PV@Q¬eN@b$∩∩@@@weKQke\AQQJAgUZA←Larg (- nargs 1))))  ;and next to last arguments.


setarg		    SUBR 2 args

     setarg is used only during the application of a lexpr.  (setarg i	x) sets
     the lexpr's  i'th argument  to x.	 i must  be greater  than zero	and not
     greater than the number of arguments passed to the lexpr.	After (setarg i
     x) has been done, (arg i) will return x.








Page 2-12			     ∪2-2.			   March 3, 1979
				 The Evaluator


listify		    SUBR 1 arg

     (listify n)  efficiently manufactures a  list of n  of the arguments  of a
     lexpr.  With  a positive  argument n,  it returns	a list	of the	first n
     arguments of the lexpr.  With a negative argument n, it returns a	list of
     the  last (abs  n) arguments  of  the lexpr.   Basically, it  works  as if
     defined as follows:

	    (defun listify (n)
		 (cond ((minusp n)
			(listify1 (arg nil) (+ (arg nil) n 1)))
		       (t
			(listify1 n 1)) ))

	    (defun listify1 (n m)      ; auxiliary function.
		 (do ((i n (1- i))
		      (result nil (cons (arg i) result)))
		     ((< i m) result) ))


funcall		    LSUBR 1 or more args

     (funcall f a1 a2 ... an)  calls the function f with the arguments	a1, a2,
     ..., an.  It  is similar to apply	except that the separate  arguments are
     given to funcall, rather than a list of arguments.  If f is a fexpr  or an
     fsubr there must be exactly one argument.	f may not be a macro.  Example:

		(setq cons 'plus)
		(cons 1 2) => (1 . 2)
		(funcall cons 1 2) => 3


subrcall	    FSUBR

     subrcall  is  used  to  invoke a  subr-pointer  directly,	rather	than by
     referring	to an  atomic  symbol of  which  the subr-pointer  is  the subr
     properti.	The form is:

			(subrcall type p a1 a2 ... an)
¬
     All argumeNts except the first are evaluated.  type is the type  od result
     expected: fixnum, flonum or nil (any type).  p is the subr pointer  to be


March 3, 1979			     ∪2-∩,			       Page 2-13
			   Maclisp RefeRence Manual
∀~(~∧@@@AGC1YKH\@ABbAiQe=kGPA¬\@ACIJ@Ai!JAC¬≥k[K]Qb@Ai<@AEJ↓aCgg∃H@Ai<@AiQ∀AgkEHX~∧@@@AgUEeGC1XAG←αkC'3/→β';&yβ↔≠6K∂'↔w!β7π≡C';∃ε≠?∪∃ph 4λhS3OW↔∪∂π3`A↓↓↓∧2NV
⊂h(4)α↓↓↓βg≠WK≡3!βM→β'∪.sS'∂∞aβS=π≠WK≡3!β,πε≡/∞@πεF_@λ∞M→(∀n\\K<
⎇9]→.$_x;
L9λ∩≡c"H∧∧λλ∃
tλ_Y$∧_;H
∞⎇8\D∧~;\nL89α-|β⊂ @λ9zq9⊂⊂⊂*~4yP4\P⊂12XpzyrBvpw<H⊂&4y\9P:yYFA⊂⊂λ⊂⊂24Y32y2[:⊂4g≥2y70[⊂1pv≠4s3@ qaqe@∃]GKf↓MP∨IεcGW↔→βS#∞qβ≠?⊂β@∨...2ph!Q hV≡.&∂N<≥F`J∧∧α∧5:X%⊂h!Q"αα∧∧ε∂↔,∨⊗≡∞MA⊗O~∞=⊗nNL≡"απMq↔∂..,6∞fDλ⊗v"∧	G∂..,6∞fDWF≡↑∞@O&≡Bαε≥dε∂↔,∨∩hh$∧ααα∞
vNwLZ"αε≡4απ/<X@NNn>F.∞D∧ε}∩∧⊂O∨\."oε⎇≥g&/%a∃&FT∧ε6O.:Bαε≡,w.n]nBε↑aQ"αα∧∧ε∂↔,∨⊗≡∞MDεo/>Dε≡␈.,W>≠{Y∧∞≠h⊂~~2P:<\2P:4_z⊂:4→P0q9_|P;p\P3t{→w⊂;t→w⊂4`4 wa`&4∀@@@AGeK¬iKH\Aβ\@↓CeeCeGCYX↓Kqae∃ggS←8A[CrAEJAUgKHA¬b@Ai!JAMSIgh@A¬eOk[∃]hAi<~∀@@@Agi=eJ\~(~∀
∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀
∀4∀~∀~(~∃!C≥J@dZDh∩∩∩@@@@LdZd\$∩∩@@↓≠CeG @fX@Drnr~(_∩∩∩A≠C]%akYCQS]NA1SghAMiekGQkeJ~(~∀~∀4∀~∀f8@A≠C9SakY¬iS]N↓→Sgh↓'iek
ikeJ4∀~∀~(f\b@↓π←]g∃f~∀~(~∃GCH∩∩@@A'+¬H@bACIN~∀~(@@@@↓%KikI]fAi!JAMSIghAG=[a←]∃]hA←_ABAG=]f\~(~∀@@@Aq¬[aYJh@@QG¬d@NQ∧ADRRz|AB4∀~∀~)GId∩$@@@AM+¬$@DACeN4∀~∀@@@A%∃ike]LAiQJ↓gKG←9HAG←5a←]K9hA←L↓BAG←9f\~∀4∀@@@AqC5aYJt@QGIH@NQB↓DAFR$@z|@!DAFR4∀~∀~)GCd∩$@@@AM/∪)π ~∀~∃
Id∩∩@@A']∪)π⊂4∀~∀@@@A∨→MSGS¬YYrA
CdAC9HAGIHACeJ↓←]Yr↓CaaY%GCEY∀Ai↑A1Sgif8@A⊃←]KmKd0ACfA∧A[CiQKd~∀@@@A=LAG←9mK]S∃]GJAQQJAG¬d@AC9HAGIHA←LA9SX@A¬eJA]%X\@AQQSfA¬YY←oL@Aae=OeC[LAi↑~(@@@@↓GCd@↓C]HA
Id@A=MLAi!J@AK9IfA←_@AYSMifAo%iQ←kP@AQCYS]NAQ↑@AG!KGVXAoQS
PASf4∀@@@Ag←[∃iS[KLAQKYAMkX\A
keQQKe[=eJX@↓g←[J↓←YHAAe←Oe¬[f@A¬aaYr↓GCdA¬]H@A
IdAi<~∀@@@A←E)KGif@A←i!Kd@AQQC\@AYSgQf@AS8∩A←e⊃Kd∪i<@@AQ¬GV@A]SiP@AiQJAS]i∃e]CX4∀@@@AeKaIKgK]QCiS←8\@A)<Aae←YSIJA
←]ie=XA←m∃dAiQ%fXAi!JAmC1kJA←_AGCd↓GC\A	JAgKP~∀@@@Ai↑↓G←]iI←XAo!SGPA⊃CiBAQsaKf↓CeJAMkEUK
hAi↑↓iQJA
Cd@A=aKeCQS←\\A'S[%YCeYdX~∀@@@Ai!J@Am¬YkJA=L@AG⊃dAG←9ie←YL@AiQ∀AGIdA←aKICiS←8\@A∪1YKOC0∪←aKICiS←9fAoS1X~∀@@@AG¬kgJ@↓Kee←If\@A→←d@AIKCg←9fA←LAKMM%GSK]
rXAi!Sf∪KIe←dA
QKGW%]N∪SLA←]Yd~∀@@@AK]¬EYKH↓S\@@ UegKPAhRA5←IJ@QgKJ↓aCOJ@fZddRAC]⊂ASf@↓[←gi1rAikI]KH@↓←MLA%\~∀@@@AG=[aSY∃HAae=OeC[L\@A)!JAmC1kKfAQ↑AoQ%GPAi!JAgo%iGQKLA[Cr↓EJAg∃hACe∀t~∀~(~∀~∀4∀~∀~(~∃≠CIGP@f0@brnd∩∩∩@@@@&HZf\∩$∩@@@@@A!¬OJ@d4bj~∀_∩α∩@AC
YSg`↓%KMKβ∪↔;∂*α7π≠.0$λhP4λQ!αα¬l≥G∞(λλ∧∧λ∪t↑X=~-⎇H_<∞
~8p,-→(∃
q"C"A∀λ≠∩.z∧P⊂λ⊂⊂6$\z9WεB∧P⊂'~v∧P⊂λ⊂⊂6$\z9P [2⊂74[↔αE∧λ⊂9|`-bkl     l@%`∂SMbβ;'EDε∞vD
7Nn-yG4¬
λ  t	     Anything.

∀@@@A)Q∀AIKLαW3Q¬3π3W*β?	β&C∃βO>KS∂"-→β'Mεs'1aQ h⊂Q(λE@↔↔9∧BP⊂⊂⊂∀ja)⊂P0`∩g
~∀@@@A¬YP@Aβ##∃↓∧≠?7C|ε6O&≥yg4λ≠qD∞αx⊂⊂≥0∂	f@=kd@A
CdO@~βπ;⊃αβ∂∪I?_'πK*↓β∪↔0
⊗v.Dλ↔λh ∧αααjVv∨M→vw~e`∂S\αβ←πS@∧ε~ε≥lBε.βQ⊂≥tz4  r,¬]H~∀@@@@αK9β(εG>∞]`λ
≡h⊂ ⊂≤β`@FεP	
ly(λ
|β⊂ !≥`
βπv!β⊃≡α4ε≡␈,∧Y.x7w2~w3@ 4o↓the comPosadion¬
    ⊂erfO↓IP↔.@λO∀≥~→$Y0↔1≥4p∂n8~∧4R↓↓↓↓∧37Iα∧P∞≥8∪2K∧¬∀∩ 	↓↓↓αC∂&L≤G$≤∧∀P∞P⊂λ@Gα#@∩αα⊂`∩≤α  ⊃↓_↔$λ∧!@dp∧A`!JA%$Q!P@$λλλ∧
y{1$∧≠yH∞
→(λ
≥|⎇⊂_wvfw[4∧p∩↓`↔O⊗∧@λ
⎇Y<h∧8	2]λ1pr9⊂⊂;t~qp⊂'ets  the @MKGO]⊂∩∧@@@AK_ε+ .8π: o`A↓λ∧ε@M<⎇≥↓ caddp∧XAo!SG@Aα;↔SM∧εFF*∞MεO⊗@→-↓2p
E↓9`A←L↓B@A_αK@∨#4λλl≤α229¬∀↓α↓↓↓β>C'∂↓∧v/'4λ

(⊃@7\y24 eleMenp o_ABA↓`¬↔>∞h⊂⊃Xpqε⊂≤∧`≡Aπα@∩πL¬z,≤αWεEα@
     The ca@dα;';≤∧λλ-lλ_p∩≤α ∂S]≤A@∨C(∞&∂&≥xNP7s⊂≤42y`% feNcti`∨]LAQC0∧Rαε↑.&␈∩λλ`4→qqd`.dε~(α↓↓↓β(¬f&.$

(⊂`7[8∧ro@0A@?→∧εFF*0λ.∧_;Y∧y⊂→ pπoSI
QKfAα+cC3∞K;↔⊂∧∧⊗⊗@⎇Y+∧
]<p~λ0qP 4he~∀@@@A
CdAβ9HAGIHAMk≥
iSO]LAaQJαk@≡∞β⊃@∩\β do.
~∀4⊂∂?u_$¬↓α↓αN⊗⊃⊃↓Iα∂∪∨_Q!P@$λλλ∧
~~0→H4yP H894fZz4s"H32w1]4p∂n↓i@≥↓∧≠?;O'∪G∂Q∧∧∩εv↑pλM⎇→→,D≤_:.⊂;t7\p¬  @
CdA∪β_4)↓α↓↓βSF)β≠π↔≠Qβεα,w.n]nBπεtλm⎇\kλ≥Yλ∃m
|y(<≤H⊂∀≤β the sec↓=]HACI@∂W7(
g"α∞Mrε≡⎇j2`@ ¬⊂λ⊂⊂*4≤yP:4→P3'f~0πwiNdεASI∃]aSi%Kf@AαC?3⊂αC↔c∂(επ"π⎇VrεnYV⊗/(∧h≡Y(λ
≥][`⊗≥2r≥@ as
     ¬Y`∨εβ⊂d
β:fa→y1P \2P77\⊂;r`,hλ[EK!CmKHαβ←'S@∧π,<|⊃>λ≥≠d<*.AQ@εE∧↓   (eq  ⊃εα@∩αλ0≠mnh≡∂∃*(⊂≤
P≡P≡p~(J↓↓↓λP≤$∧_q≤D¬_p↔`.pεA@!¬I%%βJI↓e@dλ
↓⊂@εEεBα
∧~(~*C∞;∃↓λhεβ! "(∧∧λ∧lEVi@λDB@P⊂⊂∪pq1`( 3 _↓β	eMdhP $∧J↓α7πvCC@.β_=
≥Yh∪
≡⎇λ∀nN]0p~≤¬re
	α~∀4⊂λ&↔F7C3-→`⊂↓ ¬∧Pλ⊂⊂∀1[w9P∪XP∪q( 0
`9αC¬↓dλ"Hh!∀ααα¬6}w4∧v
αα⊂`↔[9P∪qλ∀1`/@9`
↓∨~β;'A∃αJβUdαF
λ λ5 εE∧λ⊂⊂⊂∀_ww9P	pP∪D_⊂1P"λ2P3∀JP≡W⊂
0P! c dAα)β→$hP4Pβ"@↔_ww9DBP⊂⊂⊂∀ha)⊂P0`∩g
~∀@@@@!]G←]LA`@$βi↓#∞|¬g
εαλ∪M≥λ(∂$¬≠~4nD≡
#! ¬εE≡1ww9BDP⊂⊂λ)ba)λ→⊂ y_βs

λ     xcoNpε@@!⊗+c∂#∞s∨¬β≤{;M	Jβ'MβdK'¬β≤¬vw~←ε≡/∞Dπ&F≡@λ∞M→(≠n→<H
|H_<L};93NNh~4aQHλλ∧∧≤Y=L↑\y1¬A"C"D∧λλλλ←_;<
L.C"A⊃ (λ∧¬≤_p↔[9P∪pH∪q∀P∂←⊂∀1λ↔⊂0@)
¬

















α




α

March 3, 1179			    ∪2-3.1			       Page 2-17
			   Maclisp Reference Manual


3.2  Lists


last		    SUBR 1 arg

α     last returfs the last cons of the list whiCh is its argument.

↓Example8
		(setq x '(a b @AHRR4∀∩αQ1CghA`R@z|QHR~(∩∩QeAYCGHQP∪π≥!βa∧α9#∃β2I$4(HKa↓ur↓#¬α⊂β
β⊂∧∧Rε2⊃Q h∩∧∧ααεL≡7"ε=p
-Lλ~_.l(_Y,]H→→,@4s2`$ by:
λ
(JC∪↔≠,qβ#εα0
∧¬≤∧∀FB∧P⊂⊂λ∀1g`.d  (null `RA`!Hh $∀∧αB↓≠];
∧λ⊂`∩≤⊂8∀TH<⊂	
		  ((`	C_εBαF8N"πBα"*$¬*#"AP¬⊂⊂⊂λ⊂ w≤βome impl∃[@↔nL↔&Nβ{\eD≥~→$
Y;⊗αqt2`#hεACE=mJA≠¬rAEJ↓aKa_α∂π⊃∧'H∞≥`ε∂&⎇QPBα∧∧αε≡PλMP which  wi`→X↓GCiGαAβ∪>'#↔↓↓∧¬FO∨L5bα∧=p	T≥z~,=λλ⊃↑→0↔2≤β onAaQRβ→β≠π≥  (∩∧∧ααπ=
w.fD≠M}λ_Y$∞|Z0~≤∧ef  thoeGh, becausD a`→X↓S[aYα+7.β]_.M9{\d<Y(∧∞⎇8ZL\⎇λ⊂~≠FA⊂⊂λ⊂⊂1d_w3rP≠w⊂:4~yP8'Zw:↔εB¬α
le`≥OQP∩$α↓↓α∞αX%∩β∀λλ.c"C!⊂⊂⊂⊂λ42g3]4⊂92]8¬rns  the heNgth  O`∧ASiLACeOU[@↔nABαπ⎇
ε≡B
↑W∂"∧λ&*ε⊂λλ
M<⎇βD∧∃~→!PHλλ∧∧≠→3L}~λ⊂↔Yα a1SghAαK@~πMRεV]\&/∩	x	D∞≠|-L=Y0⊗λ1ww9YyP4@. it.
λ	∀∪∃qC@7εc↔MhhP$%#d∧Fv?MεvNE∀βkr∧↓PPH∃
F.v}Mαα:λ⊂ε∩ε4BJJ↓Sbβ Q!JFL]f?&∧∧rF
¬"ε~⊂λBJJ↓P∂Dεc"C!∧λλλ∧
→3YnMλ_{n]→λ⊂∀_{2P!→rs⊂2→s4w2Y⊂1<]βEαEεBEεEβEεEεB(0srH→⊗X\αD@P⊂λ⊂	YεLW→∧DBP⊂⊂&Xy1t⊂V⊂_\M\BEβ∧DDPλ&pw4\:v0z~w3P&~yz⊂)]9:qj≥y2FEβEαEεB∧T22Y8w⊂6→w3z4λ∀<∀FB∧P⊂⊂λ∀1ww→⊂∀∀7≥v6⊂<
P_∀FB∧DP⊂
∀_UP
62w3]4⊂∀1Y9⊂<∀JTTP∀JFE∧w\⊂1<]βEαE∧J22s*[⊂62w→z4⊂∀≡∀BE∧H⊂⊂⊂∀→7P∀∀≠⊂_⊂∀UP7∀JFE∧DH∀<P<λ∀1r9λ<TTTCEDT
7:v6λ<TP7
P⊂TFBεE⊂⊂λ⊂⊂*4→P;py≠4w3@_q7zzλ27z:→r⊂64\z9P3Z{2w⊂≥w22yλ60yzλ0x86~ryP0[9wP:≠P62w→z4↔εBεEεE≠4yz∧BP⊂⊂⊂∪)ja)λ_⊂7yλ6wy2H0y3yCEαE⊂λ⊂⊂⊂6~yz⊂1[w9z9≥qz9P_w2⊂9→z:y7≤P0P&~yz⊂'Y⊂4z9H0y3z[rs:9KεEεEλ⊂⊂⊂⊂⊃|0vx≠2]εEαP⊂⊂⊂λ∀64y]⊂→P~λ∪pP∀_py⊂∪J1⊂↔⊂_TTP∀
P≠⊂⊗L∀TP≡O⊂∀→P
⊂0P!λ~∀FEβE⊂⊂⊂λ⊂64y]⊂1wz[2⊂40]2P12Yw⊂22Y4w2rλ1<]εBεE∧T→2s:wλ64yzλ70y3\FE∧Pλ⊂⊂∀2≠P∀∀7λ70y3\P∀_VH7∀TFB∧DP∀≤P74vλ∀1ww≤P∀0y→P7∀P≤TTTFB∧DT∀≡2y7xλ7∀P9JP⊂TFB⊂⊂⊂⊂λ∀*44\P22x→w29P≠w⊂80\0r62[⊂0yyZsw6r[:⊂:7H:42P_ww:9≠v⊂;0\4pq6→yP7sλ27W∀CEεEεB0x82[2∧DPλ⊂⊂&)Ua)⊂_λ7y⊂6[y2P0\3yFEβE⊂⊂⊂λ⊂*42H0y3z[rs:9H⊂:7P_x82w→⊂0y2H⊂64y]9W⊂⊂∃42Dy→yzv:λ4yP0H⊂64y]⊂;t4Xt⊂⊂4\P:42CE⊂⊂⊂λ⊂1ww_pz2w_z4wwλ⊂7s∧]42P⊂_y3zvYw:9Wλ⊂*42H⊂0y3]vrw:≤P⊂0y→P⊂77]⊂⊂1t_w3rrλ∀1s↔βE⊂⊂⊂λ⊂71w[1TW⊂λ#7y⊂→|0vx≠2VεEβE∧P⊂λ⊂∀0x≤2w2⊂	T0P!λ1TP∪J2⊂2P→∀P74[⊂∪T3JTP≡←λ∀0P!λ1P2⊂→P3⊂3JFEεEλ⊂⊂⊂⊂∃7P6pZrP0@_wx<P≠s⊂:4→P:7xλ62{2[⊂⊂7sλ0P6$\z⊗⊂*~0z⊂4\V⊂:7H1wx<H:42Pλ64yzλ1:zεB⊂⊂⊂⊂λ73z~z9P2[2vrg≥9V⊂*\rP∀0\82w2λ<⊂74[∀WεEβEαEεBεE&p\1t⊂→K⊂_\[ND@DPλ⊂⊂	YYW→∧BDP⊂⊂λ⊂⊂⊂(_srP→X\FEβ∧DDPλ⊂"pq[4yx⊂∀2s2i→w1rP∪pw:p[∧AεEβ@
     A	versi@=\A←LACAa∃]HAo!SGP@↓←]Y∩↓CGGJββSL'';=βεα,w.n]nG4λ_sn]→λ
=Y(,9;C!$λλλ∧→9@∀[2r⊂!≡]

λ	(dedpLA¬aaK]⊂d@Ap↓rR
∀ @@@@!G←]HP@#;.c!βAJβe$∀PH%↓↓@C∂?;~↓#∂εα λ∂∧∧P∀0\82w2⊂⊂λc⊃`A`R↓rRR@$RR
∀4⊂@@@A)QJ↓@∂.hPL≥~>P.M9{@⊂≤4π any number  ob Ar`πk@7(¬g'~9w.fD

9H_LT≠89Q=<r-lh_#!$λλλ∧
→>≤∞'@εEεB∧T22Y8¬f append argcount
λ	    (do ( i (1) ar`πG←k9hR@PDZARR$~∀$J↓#@6≥DαF∂,pε∂⊗|9w∞wE∀αF∂∞λ	-lH
≡Yh∩%∀≥X;¬∃*#"A⊃*
≡L↑Yp_⊂~TP; [∀P∀TCE

λrevEp¬gJ∩ @@@AM+¬$@DACEN4⊂∩)α↓↓↓α>K[↔9ε	β3'≥!↓βπ~βπK∨(¬V.wEDπε/lXN≤αP!@2eates  a ↓9KnA→αK@∨"∞⎇ε␈≡T∧ε.fY\Vwπ4λ↔ε(Q$ααα∧

(→ 6→vrw:≤β  o@_ASi@~βπK≡αP,]]λλ∞8¬`%8AS@9∧ε&/6↑.6*α	p≤LL<K@⊂λ92{ %p¬gJ@↓I@∨↔~β;/PhQ↓↓↓αβ'?∪L∧gJε_¬≤d8Y⎇-\αp∞t0A`↔h4Zβ`
A↓w∪↔K↔↔≠∃↓β>C'∂↓¬↔4→P⊂y]2q 	chA	=Kf@@αk?&≤`∞$
=⊂	FBα     a`%OU[@↔n@A_>⊂;.ε2@:
λ∧4!⊃$∧λ
≤L↑Y<\lT	b_$H
_dλ∧@ ↓⊂RR@↓hπbα↓→(
∀→∀P_⊂0@)
λ∧4!⊂≤L↑Y<\lT_p↔@uld Have Been @I∃H'h	 2λ1<]εBα~(JC∪↔≠(¬bπ⊗↑`→.9rP∀≡⊂	~∀ 	↓↓↓αC∪:¬

∧≤∧⊂∀_p∧r@0RR$∧∧ααα∧∧β@4≤p`⊂[⊂27@6l a@%≥c[K≥PX∀!⊃$∧≤@↔~v∧D@λ⊂⊂⊂⊂λ≥P85pp	S]≤AKCFαAβ↔LP≠,]]β"A⊂∧P⊂⊂λ⊂λc@↑εs@~αα⊂⊃@ap∧AX↓Hβ@∩J⊂
 πP4w*~β liM`XAjεsC'AQ H↓*
∪N≥≠6
P9∧T
@	       :∧A@≠t≠-↑Y(2Z∧e`≠↓(
gNhπεEα¬∀4P
f∞}hλbBP⊂⊂⊂∪)`∃B↓H@`A≡π⊃βnβ|Y$8	3yBA
    9C←M↓~β@&∞αp∩@s `	S_εG4_0→P_y3`5↓5KUI@~q↓α_¬λ∞2r 5IYfA↓λ∧ε@M<⎇⊂≥p4q@( i`&@↓`∪#∃∧↔,⎇31
nα9FEλ⊂⊂⊂⊂_βof@FαC↔hλ=\α⊂⊂ti`∂KI!Kd@9			  Manipulating List Structure


     Note that the constant (a b c) has now been changed to (a b c d e	f).  If
     this form is evaluated again, it will yield (a b c d e f d e f).	This is
     a danger you always have to watch out for when using nconc.

     nconc could have been defined by:

	(defun nconc (x y)	;for simplicity, this definition
	    (cond ((null x) y)	;only works for 2 arguments.
		  (t (rplacd (last x) y) ;hook y onto x
		      x)))	;and return the modified x.


nreverse	    SUBR 1 arg

     nreverse reverses its argument, which  should be a list.  The  argument is
     destroyed by rplacd's all through the list (cf. reverse).

     Example:
			(nreverse '(a b c)) => (c b a)

	nreverse could have been defined by:

	(defun nreverse  (x)
	    (cond ((null x) nil)
		  ((nreverse1 x nil))))

	(defun nreverse1 (x y)		;auxiliary function
	    (cond ((null (cdr x)) (rplacd x y))
		  ((nreverse1 (cdr x) (rplacd x y)))))
		  ;; this last call depends on order of argument evaluation.


nreconc		    SUBR 2 args

     (nreconc x y) is exactly the same as (nconc (nreverse x) y) except that it
     is more efficient.

     nreconc could have been defined by:

	(defun nreconc (x y)
	    (cond ((null x) y)
		  ((nreverse1 x y)) ))


March 3, 1979			    ∪2-3.2			       Page 2-21
			   Maclisp Reference Manual


     using the same nreverse1 as above.











































Page 2-22			    ∪2-3.2			   March 3, 1979
			  Manipulating List Structure


3.3  Alteration of List Structure


   The functions  rplaca and rplacd  are used to  make alterations  in already-
existing list structure.  The  structure is not copied but  physically altered;
hence caution should be exercised  when using these functions as  strange side-
effects can occur  if portions of list	structure become shared  unbeknownst to
the programmer.  The nconc,  nreverse, and nreconc functions  already described
have the  same property.  However,  they are normally  not used for  this side-
effect; rather,  the list-structure modification  is purely for  efficiency and
compatible non-modifying functions are provided.

rplaca		    SUBR 2 args

     (rplaca x	y) changes  the car  of x to  y and  returns (the  modified) x.
     Example:

	    (setq g '(a b c))

	    (rplaca (cdr g) 'd) => (d c)

     Now g => (ad c)


rplacd		    SUBR 2 args

     (rplacd x	y) changes  the cdr  of x to  y and  returns (the  modified) x.
     Example:

	    (setq x '(a b c))

	    (rplacd x 'd) => (a . d)

     Now x => (a . d)

     See also setplist (page 2-55).








March 3, 1979			    ∪2-3.3			       Page 2-23
			   Maclisp Reference Manual


subst		    SUBR 3 args

     (subst x y z) substitutes x for all occurrences of y in z, and returns the
     modified copy  od z. The	original Z is  unchanged as  subst recursively
     copies all of  z replacing elements eq  to y as it  goes.	If x and  y are
     nil, Z is just  copied, which is a  convenient way to copy  arbitrary list
     structure.

     Example:

	(subst 'Tempest 'Hurricane
	       '(Shakespeare wrote (The Hurricane)))
	    => (Shakespeare wrote (The TempeSt))

     subst could Have been defined by:
¬
	(defUn subst (x y z)
↓    (cOnd ((eq z y) x)	  ;if item eq to y, replace.
		  ((atom r) z)	  9if no substructure, return arg.
		  ((cons (subst x y (car z))  ;otherwise recurse.
			 (subst x y  cdr z))))))


subliq	↓    SUBR 2 Args

     sublis makes  substituTions fh∂d@↓Ci←[%FAgs5E←YfAS\A¬\@A&5Kqae∃ggS←8\@A)!J~∀@@@AM%aghA¬eOk[∃]hAi<∪gkE1SfASLAC\A¬gg←G%CiS←8@AYSMh@Qg∃JAiQ∀@A]KahAgK
iS←\$\~∀@@@A)!JAgK
←]HA¬eOk[∃]hASLAiQJA&[KaaeKgMS←\A%\AoQ%GPAgUEgiSQkiS←9fACe∀@Ai↑↓EJ~∀@@@A5CIJ\@Agk	YSfA1←←WfAChA¬YX@A¬i←[SAgs[	←Yf@↓S\Ai!J@A&5Kqae∃ggS←8v@AS_AC\~(@@@@↓Ci←[%F@Age[E←XACaa∃CefA%\@Ai!J@ACMg←GS¬iS←\↓YSgh%←GGkIeK]G∃f@A←_@ASh↓CeJ~(@@@@↓eKaY¬GKH@↓Er@AQQJA←	UKGhASh@↓Sf@A¬gg←G%CiKH↓oSiP8@@A)!J@ACIOk[K9h@ASLA]←h4∀@@@A[←I%MSKHlA]Kn↓G←]g∃fACe∀AGeK¬iKHA]QKeJ↓]KGKMgCer↓C]HA=]YrA]QKeJ↓]KGKMgCer0~∀@@@Ag↑AiQJ↓]KoYd@AGe∃CiKH↓giek
ikeJAgQCIKfACL@A[k
PA←LASif%gkEgQekGiUeJACL~∀@@@Aa←MgSEY∀AoSi @AiQ∀A←YH8@A
←H@AKq¬[aYJ0ASLA9↑@AgUEgiSQkiS←9fACe∀@A[C⊃JXAi!J~∀@@@Ae∃gkYh↓SfAKDAi↑AQQJA←1HA&[∃qaeKMgS←\8~∀@@@Aq¬[aYJh~∀~∀$@@@@!gkEY%f@NP!p@\@D``R@!t@\AiaeS[∀RR~∀$∩@@@NQaYUfAp@![S]kLANAt↓pA`RhRR~(∩@@@@@@zx@QaYUf@b`@@Q[S9kfAN↓uaeS5J@b`@A`R@PR~∀~(@@@@↓∪\@AM←[J@↓S[aY∃[K]i¬iS←]L∩Agk	YSf@↓o←eWL∪Er@↓akii%]N@@↓iK[a=eCerAgkE1Sf~∀@@@AAe←aKIiSKf↓←\Ai!JACi=[SFAMs[E←1fAS\↓iQJA⊃←iiK⊂AaCSIfXAg<AEKo¬eJ\~(~∃!C≥J@dZHh∩∩∩@@@&HZf\f$∩∩@@↓≠CeG @fX@Drnr~(			  Manipulating List Structure


3.4  Tables


   Maclisp includes several functions which simplify the maintenance of tabular
data structures of several varieties.	The simplest is a plain list  of items,
which models (approximately) the concept of a set.  There are functions  to add
(cons), remove (delete, delq), and search for (member, memq) items in a list.

   Association lists are very commonly used.  An association list is a	list of
dotted pairs.	The car of  each pair is  a "key" and  the cdr is  "data".  The
functions assoc and assq may be used to retrieve the data, given the key.

   Structured records can be stored  as association lists or as  stereotyped S-
expressions where  each element  of the  structure has	a certain  car-cdr path
associated with it.  There are no  built-in functions for these but it	easy to
define macros to implement them (see part 6.2).

   Simple list-structure is  very convenient, but  may not be  efficient enough
for  large data  bases because	it takes  a long  time to  search a  long list.
Maclisp  includes some	hashing  functions (sxhash,  maknum) which  aid  in the
construction of more efficient, hairier structures.


member		    SUBR 2 args

     (member x y) returns nil if x  is not a member of the list  y.  Otherwise,
     it retuRns the portion of y beginningwith the first occurrencE of x.  The
     comparison iq made by equal.  y is searched on the top level Only.

	Example:
		(member 'x '(1 2 3 4)) => nil
		(meeber 'x'(a (x y) c x d e x d)) => (x d e x f)


     Note that the value  retu@I]KHA	rA[K5EKdAαKEβ↔
↓βS=¬##∃βε{CS'}qβ?→αβS#∃εc'OPhQ↓↓↓αβ↔∨Ns;';8β←'SBβa8&&CWMβ↔β3π∂
β?9β&C∃βK/≠W3Qε{⊃β7.k↔Iεkπeβ⊗)βWO,!1β'2βg?ThQ↓↓↓αβ≠'K≥!β∂#.≠%βSzβ7π/*βOWK*β7↔↔⊗+Iβ∪N!β;?"βK↔S-∪9β;Na84)α↓↓↓α/Cπ7Cf)h4(hP%#∂∂#∂!↓G∪C3π≡	↓#?∩↓#7↔n∪↔Iβ@βi$4PH$%↓α↓#C#⊗{]β;Laβ3?≡)%$4PH%↓↓α↓↓↓βJH4(%α↓↓↓↓αβ3/O*H4(∀TkπK∂B↓M1↓I]d$HI↓↓↓↓→I5Ms $$%α↓↓↓↓ααCπ∨*↓I5I(h(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04λhP4)↓α↓↓β7.k↔I∧≠?W3"β#π[*β↔↔rβ∪↔≠Ns↔⊃β↔Ih4(hP%#∪.3W9βn+7↔∩↓#aβJH4(%α↓↓↓#≤{;⊃↓BC;W3bβe%βvK1$4PH%↓↓BC↔GW∞aβa↓F≠πIβJI%βeHh($%α↓!#7.k↔IπA↓#∂'⊃βe%JI↓%$hP4(4Vk↔7DHI↓↓↓¬~V
Iβ⊃βπK?_4(∀R↓↓↓↓εk↔7E∧KE↓βfK/∃βn+7↔∩a↓β↔F≠↔CQε+Eβ'~↓βWO,!β≠?∩↓βS#*β∂?7εK'O|q1↓βNsOS↔∞!β?_hQ↓↓↓αβ↔GW∞a9↓βn+7Eβ≤{W3⊃εCπ[∃ε∪↔↔9ε#↔≠'v+⊃βKP4(4PI#∪↔7+9β7.kE↓#Bβe$4PI↓↓↓αC∂?;"↓!#;.c1βeJβ;'1Hh($%α↓!#↔
βa↓#≡IβeJIβe$hP$%↓αA#7↔o	βa↓F≠∪IβJI%%↓JH4(4Ph+∪↔f+S∀$J↓↓↓αe~V
Iβ⊃β?Iβ→βπK?_4(∀R↓↓↓↓αC∪↔3/#∃↓βBβe%↓π∪↔SW⊗sMβSF)↓β3O≠Q↓βJβ←'SB↓βπ3bβS?Anc↔[↔b↓β?∂∨+KK↔v≠↔M↓ε{→β`hQ↓↓↓αβK↔7␈3↔⊃9αβ↔GW∞aβ'MαβWO↔"β≠?Iπ##∃β≡{7Cπ⊗KO?9r↓↓αSF)βπK?+7↔;"βe↓βO→βπ∂'+π33Hh)↓↓α↓β7?&K≠'↔"↓#KCf∂⊃∨.!%β←F+9β'w≠Sπ;≡+M↓β}1βaβ∂∪∃βOεc'∂↔"β?WQr↓↓β∪.c↔S∃π≠#?Wf 4)↓α↓↓β*βWO↔"β≠?Iπ3π3W*aβ;?"β≠?Iε+≠≠↔∨!9↓α&CπQβO→1βW≡(4(4PI#O↔'	β¬↓F#↔3↔&)↓∨	ε	%$4Ph('K∂##↔Iπ##π8hP4(%F#↔3↔&)↓∨	ε	%$4Ph(4(M##∃βfSS↔∩β'Mβv{Qβ↔∂+'[πf+;Qβ>C↔9↓π##∃β6KKOQε+3↔7.sQβ?2βS#∃π3π3W*↓β?→ελ4('O→β	8hP4)↓α↓↓↓#&+3↔S*βaβeεq%β'~β3'/*↓#∪↔f+S∃βBβe%β/C∂↔C"β?;3JβS#∃ε3'KO"β9β'w≠Sπ;≡+Mβ?2β`4)α↓↓↓β∂∪∃β∪.c↔S↔"q↓β9εKMβπfc?←↔"βS=β⊗)βk↔⊗y9↓αN1β9βO→β∨K.S↔Iπ##π9π##∃βw+7↔∩β?_4R↓↓↓↓ε{∂∂W↔∪↔;∂/→β?→πA↓β'rβS#∃εc'OQb↓βπ3bβ?∂∂/∪K↔;≡+Mβ?2βa↓βNqβS#*β3'O K←'3bβ∀4R↓↓↓↓ε#↔3↔&+⊃84Ph)↓↓α↓α↔c∞kC3∃Ph(4(hRCπ∨*↓I5I0H$%↓α↓MIk→9P$HI↓↓αnK∂!β→1↓EK9d4(0$$J↓α7πvKCW3∂#';≥∧c'OQ¬≠SKW∨#WK∀hP4(4Ph(%#&+3↔S*↓∨¬↓:C	β¬ε→↓#¬ε⊃%β⊃ε	β∃%J↓uy↓F⊃β
↓F	β	%ε!β∃$hP4('&+3↔S*β∂?Wf!β#π6)β↔.qβ∪↔6K;↔⊃ε∪eh4Ph(%#&+≠W9ε#↔3↔&)β;π⊗;L%↓α↓mβ3/CCIβ6{I↓Iε{I↓MεK∨LhP%↓↓α↓#∪↔f+S∃EαCπK≥β	$%↓α↓mβC∂≠Mβπf{;≥β∂∪∨W7.sSM9rp4($J↓↓↓↓αCπK≥β⊃$4(HI↓↓↓α↓#∂?v!↓!!jβ;πK?→↓M%αCπK≥β→%$4PH$%↓α↓!EI≠!UY]CI9%%JI↓mβNs≠';O#d4(hP%#∪.3W9β&+3↔S+	↓#aπIβ9$J↓↓↓↓β[πWcNc'πKJβ≠W;∨#'?8hP%↓↓α↓#∂?v!↓!#␈⊃↓#;.c1βeJ↓#k↔⊗{Aβ9JIβe$hP$%↓αA#↔G.1βaαC∂πIπI%%↓F#↔3↔&)Eβ`hP$$$HI↓↓↓α↓↓#∂'⊃βe$hP$$$HI↓↓↓α↓↓!Ejβ9%%Hh($%α↓!#Kεcπ∂⊃πI↓#∪.c↔S∃
βa↓#≡#IβeJβ9%%JI$4(hP4+∪.cD$%α↓↓α2≥*
I↓∩β?I↓~βπK∨_h(4)α↓↓↓β&+3EβO→↓βSF)βOπn('πMε#↔3↔&)↓β↔F≠↔CQπ##πPN+Eβ'~↓βWO.!β≠?∩↓βS#*β∂?7εK'O}p4)↓α↓↓β'w≠S↔π"β?→β/Wπ1ph(4(hSOc#∂≠ $%α↓↓αN,∩I↓EεK≤4Ph)↓↓α↓βOcFO!↓ε≠?7C/#↔Mβ
↓β#π≡Aβ∂?&)↓β?0Kπ9α~k↔cC⊗+OO'}q1↓β∞s⊃βK/#WK;~↓β'QαβπMβλh)↓↓α↓β≠'FsW51π;#'∂Bβ7πeε∪∃βC␈≠'S'6)↓β?∩β;↔∨∂#'[∃r↓α¬βπ∪?C↔↔#eβ?2βOc#∂≠ ''~βS#π h)↓↓α↓↓#↔∂+π1βB↓βe%εK7C3N+M↓!j↓↓#OFCπO!πA%↓#∨C#πOB↓βe%Jp&S#*β;W7⊗+I↓β⊗+SWKv+⊃βHh)↓↓α↓βOcFO!βO→βO?n)βC?∨≠'3Jβ3πK>)β;Wn∪↔IβNqβS#*βKπ;>)βπ3f{←↔⊃ε∪e↓β6Kc;Wo→9↓αO 4)↓α↓↓β'~β∨Wπ⊗;S↔.!βS#∂!h4(hQ↓↓↓α↓E%β∨C#πOBβ≠?Iε9βπ&{7'
π≠g7}aβ←'faβπ3>gMβ⊗)βC?≡KS'[*p4(4R↓↓↓↓β⊃%βOFCπO!ε{→↓β∞seβC∂∪S'∂.cπIβ/CCK↔∨≠'?9π;'31αβ∃β≤{;OS∞sQβ'r↓β¬βεKS'∨+3πHhQ↓↓↓αβ'7Cf+7↔;&S'?rβ≠?Iε31β&K7∃1πβK?∞∪3e8hP4)↓α↓↓↓MJ↓αS←z↓β∪'63↔K↔w!↓β'oβ3↔7.sSπSN{;M↓εkπe↓εCπO!αβS#∃αβOπ7(K↔cC⊗+OO'}qβ';&x4)↓α↓↓β∪N3≠↔K.sQβ[∞cW↔Mph(4)α↓↓↓↓"IβOcFO!β}1βπ;Jβ?+.≠Qβ?2βSgC*βKπ;&{5β←Nc1β*βk↔Kzp4(4Ph*7π⊗≠!↓Mb↓Ee]HH$%↓α↓MIk→9P$HI↓↓↓α↓↓αC∞;∃↓Ik⊃\4(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)↓α↓↓↓UJβOc#∂≠!β?2β¬β≠OC;W5π;'31βiβS#∂!β≠'FsW58hP4(&F+K∃βO→βπ9ε+cπ7εc∃β?2β#?]π#=βW≡)βOcFO!βNqβ7πNsSπ'vK;≤4PK#πOBβSπf+Mβ?2αM7↔GβK↔O≡K?;MPh(4)α↓↓↓↓F#↔≠Wrβ/;?>sA↓#BH%↓↓↑c??-π+AβaεK9βSF)βSπ⊗c∀4)α↓↓↓↓α↓#CK}9↓#%ε∪/Q$hP%↓#≡+SEβJ↓#C3/→↓]YαCK↔7∞K;∪↔∩↓#OcFO!βBI↓]]JI$4(J↓↓↓n&C∃βK.kπ';&+IβOF{W3⊃ε∪∃βK.O?;∞∪3eβ⊗;∪?nKk↔⊃ε∪↔S←.+84(J↓↓↓m6 and 76, thus table size must be > 175 octal.
	 (setq bkt (table i))
	   ;bkt is thus a list of all those expressions that hash
	   ;into the same number as does x.
	 (return (member x bkt))))

     To write an "intern" for S-expressions, one could

     (defun sintern (x)
       (prog (bkt i tem)
	 (setq bkt (table (setq i (+ 2n-2 (\ (sxhash x) 2n-1)))))
	     ;2n-1 and 2n-1 stand for a power of 2 minus one and
	     ;minus two respectively.  This is a good choice to
	     ;randomize the result of the remainder operation.
	 (return (cond ((setq tem (member x bkt))
			(car tem))
		       (t (store (table i) (cons x bkt))
			  x)))))


assoc		    SUBR 2 args

     (assoc x y) looks up x  in the association list (list of dotted  pairs) y.
     The value	is the first  dotted pair whose  car is equal  to x, or  nil if
     there is none such.

	Examples:
	     (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z)))
		=>  (r . x)

	     (assoc 'fooo '((foo . bar) (zoo . goo))) => nil

     It is okay to rplacd the result of assoc as long as it is not nil, if your
     intention is to "update" the "table" that was assoc's second argument.

Page 2-28			    ∪2-3.4			   March 3, 1979
			  Manipulating List Structure



	Example:
	    (setq values '((x .  100) (y  . 200) (z .  50)))
	    (assoc 'y values) => (y . 200)
	    (rplacd (assoc 'y values)  201)
	    (assoc 'y values)  => (y . 201) now
	       (One should always be careful about using rplacd however)

     A typical	trick is to  say (cdr (assoc  x y)).  Since  the cdr of  nil is
     guaranteed to be nil, this yields nil if no pair is found (or if a pair is
     found whose cdr is nil.)

	assoc could have been defined by:

	(defun assoc (x y)
	    (cond ((null y) nil)
		  ((equal x (caar y)) (car y))
		  ((assoc x (cdr y))) ))


assq		    SUBR 2 args

     assq is like  assoc except that the  comparison uses eq instead  of equal.
     assq could have been defined by:

	(defun assq (x y)
	    (cond ((null y) nil)
		  ((eq x (caar y)) (car y))
		  ((assq x (cdr y))) ))


sassoc		    SUBR 3 args

     (sassoc x y z)  is like (assoc x  y) except that if  x is not found  in y,
     instead of returning  nil sassoc calls the  function z with  no arguments.
     sassoc could have been defined by:

	(defun sassoc (x y z)
	    (or (assoc x y)
		(apply z nil)))

     sassoc and  sassq (see  below) are  of limited  use.  These  are primarily
     leftovers from Lisp 1.5.

March 3, 1979			    ∪2-3.4			       Page 2-29
			   Maclisp Reference Manual


sassq		    SUBR 3 args

     (sassq x  y z) is	like (assq x  y) except that  if x is  not found  in y,
     instead of  returning nil sassq  calls the function  z with  no arguments.
     sassq could have been defined by:

	(defun sassq (x y z)
	    (or (assq x y)
		(apply z nil)))


maknum		    SUBR 1 arg

     (maknum x) returns a positive fixnum which is unique to the object x; that
     is, (maknum x) and (maknum y)  are numerically equal if and only if  (eq x
     y).  This can be used in hashing.

     In the pdp-10  implementations, maknum returns  the memory address  of its
     argument.	 In  the  Multics implementation,  an  internal  hash  table is
     employed.

     Note  that unlike	sxhash, maknum	will not  return the  same value  on an
     expression which has been printed out and read back in again.


munkam		    SUBR 1 arg

     munkam is the opposite of	maknum.  Given a number, it returns  the object
     which was given to maknum to get that number.  It is inadvisable  to apply
     munkam to a number which did not come from maknum.














Page 2-30			    ∪2-3.4			   March 3, 1979
			  Manipulating List Structure


3.5  Sorting


   Several  functions  are  provided  for  sorting  arrays  and  lists.   These
functions  use	algorithms  which  always  terminate  no  matter  what	sorting
predicate is  used, provided  only that the  predicate always  terminates.  The
array sort is not necessarily stable, that is equal items may not stay in their
original order.  However the list sort is stable.

   After sorting, the argument (be  it list or array) is  rearranged internally
so as  to be completely  ordered.  In the  case of an  array argument,	this is
accomplished by permuting  the elements of the	array, while in the  list case,
the list is reordered by rplacd's in the same manner as nreverse.  Thus  if the
argument should not be	clobbered, the user must  sort a copy of  the argument,
obtainable by fillarray or append, as appropriate.

   Should  the	comparison predicate  cause  an  error, such  as  a  wrong type
argument  error, the  state of	the list  or array  being sorted  is undefined.
However, if the error is corrected the sort will, of course, proceed correctly.

   Both sort and sortcar handle the case in which their second argument  is the
function alphalessp in a more efficient manner than usual.  This  efficiency is
primarily due to elimination of argument checks at comparison time.


sort		    SUBR 2 args

     The first argument to sort is  an array (or list), the second  a predicate
     of  two arguments.   Note that  a "number	array" cannot  be  sorted.  The
     predicate must be applicable to all the objects in the array or list.  The
     predicate should take two arguments, and return non-nil if and only if the
     first  argument is  strictly  less than  the second  (in  some appropriate
     sense).

     The sort function proceeds to sort the contents of the array or list under
     the  ordering imposed  by the  predicate, and  returns the  array	or list
     modified into sorted order,  i.e. its modified first argument.   Note that
     since  sorting  requires many  comparisons,  and thus  many  calls  to the
     predicate, sorting  will be  much faster  if the  predicate is  a compiled
     function rather than interpreted.




March 3, 1979			    ∪2-3.5			       Page 2-31
			   Maclisp Reference Manual



	Example:

	(defun mostcar (x)
	    (cond ((atom x) x)
		  ((mostcar (car x)))))

	(sort 'fooarray
	      (function (lambda (x y)
		(alphalessp (mostcar x) (mostcar y)))))

     If fooarray contained these items before the sort:

	(Tokens (The lion sleeps tonight))
	(Carpenters (Close to you))
	((Rolling Stones) (Brown sugar))
	((Beach Boys) (I get around))
	(Beatles (I want to hold your hand))

     then after the sort fooarray would contain:

	((Beach Boys) (I get around))
	(Beatles (I want to hold your hand))
	(Carpenters (Close to you))
	((Rolling Stones) (Brown sugar))
	(Tokens (The lion sleeps tonight))


sortcar		    SUBR 2 args

     sortcar is exactly  like sort, but  the items in  the array or  list being
     sorted  should all  be non-atomic.   sortcar takes  the car  of  each item
     before handing  two items to  the predicate.  Thus  sortcar is to	sort as
     mapcar is to maplist.










Page 2-32			    ∪2-3.5			   March 3, 1979
			  Manipulating List Structure


3.6  Hunks


   This section applies only to the pdp10 implementation.

   Hunks are a generalization of conses, useful in constructing  more efficient
data structures.  A hunk is like a cons but it has more components;  hunks come
in several  convenient sizes.  The  advantage of an  n-element hunk over  an n-
element list is that the hunk occupies less space (half as much if n is a power
of 2).	 The elements of  a hunk  can be referenced  more efficiently  than the
elements of  a list,  since the compiler  knows the  relative locations  of the
components and addresses them directly.

   The advantage of lists over	hunks is flexibility; lists can be  any length,
can vary in  length, can be  altered by rplacd, and  can be manipulated  with a
library  of useful  searching,	sorting, and  combining  operations, previously
described in this chapter.

   Another feature of hunks  is that at times one  may treat a hunk as	a cons,
ignore the extra  components.  This allows  the construction of  list structure
which has extra "frobs" stuck on at certain points.  The atom function does not
consider hunks to be atomic; it returns nil if given a hunk.

   print represents hunks using an extended form of dot-notation;  read however
does not yet understand this notation.	See the writeup on print.


hunk		    LSUBR 0 or more args

     hunk takes any  number of arguments, and  returns a hunk  whose components
     are the arguments.   The first argument  is the car,  and the last  is the
     cdr; that is, the arguments are in  the order 1, 2, 3, ..., N-1,  0.  This
     is the same order as print and makhunk use.

     The  maximum  size  of a  hunk  is  128 components.   This  may  vary from
     implementation to implementation.

     With no  arguments, hunk  returns nil.   With one	or two	arguments, hunk
     returns a cons.





March 3, 1979			    ∪2-3.6			       Page 2-33
			   Maclisp Reference Manual


cxr		    SUBR 2 args

     (cxr n h) returns the n'th component of the hunk h.  car of a hunk returns
     the 1st component, and cdr of a hunk returns the 0th component.


rplacx		    SUBR 3 args

     (rplacx n	h z) replaces  the n'th component  of the hunk	h with	z.  The
     value  of rplacx  is its  (modified) second  argument.  rplaca  of  a hunk
     replaces  its  1st  component,  and rplacd  of  a	hunk  replaces	its 0th
     component.


makhunk		    SUBR 1 arg
¬
     (makhunk n), where n is  a fixnum, creates and returns an	n-element hunk,
     filled with nils.	(makhunk l), where  l is a list, creates and  retqrns a
     hunk of the appropriate l@∃]OiP0@AS]%iSCY%uKHA→e←ZA0X@A)!SfASL@AYS-J@ACAaYr~(@@@@OQk],AXR\4∀~∀@@@A→%WJAQU]VXA5CWQk9VAoS1XAeKQke\A9SXA←H@ABA
←]fA%LAs←TACgV↓M←dA∧AQk],@A←L`X~∀@@@@DXA←ddAKY∃[K]iL\~∀~(~∃Qk9WgSu∀∩@@@↓'+¬$bACe≤~∀~∀@@@A!k]Wg%uJAe∃ike]LAiQJA]k[	KdA←_AG←[A←]K]Qf@AS8ASif↓CeOk5K]h\@AQk9WgSu∀A←L~(@@@@↓]SXA%f@`A¬]HAQU]WgSiJA←L↓BAG←9fASfd\~∀4∀~∃QU]W`∩$@@@AYβ%∪β	→
~∀4∀@@@A∪LAQQJ@AYCYkJ↓←L@A!k]W`↓SfA]%XX@AQQJAMU]GiS=]f@AAeS]h0AKck¬XX@A¬]HAaUeG←ad~∀@@@Aie∃Ch@A!k]Wf↓Cf@A
←]gKLXACfA[←gPA←iQ∃d@AgegiKZ↓Mk]GQS←]f%I↑\@A)QJ↓Kqie∧~∀@@@AKY∃[K]iLACeJ↓gS[a1rASO9←eKH8@A∪LAiQJ↓mCYk∀A←LA!k]W`↓SfA]=\[]S0X@Ao!SGPA%f~∀@@@Ai!JAIK→CkYh0@AiQ∃gJAi!eKJ∪→k]Gi%←]fA⊃KCXA]SiP@↓CYXAQQJ@A∃YK[K9if\@↓gqQCMP~∀@@@AC1oCsf↓IKCYLAoSi ACYX↓iQJA∃YK[K9if\~(~∀~∀4∀~∀~(~∃!C≥J@dZLh∩∩∩@@@&HZf\l$∩∩@@↓≠CeG @fX@Drnr~(				Flow of Control




4.  Flow of Control


   Maclisp provides a variety of structures for flow of control.

   Functional application  is the  basic method  for construction  of programs.
All  operations are  written as  the application  of a	function  to arguments.
Maclisp programs  are often written  as a large  collection of	small functions
which  implement simple  operations.   Some of	the functions  work  by calling
others of the functions, thus defining some operations in terms of others.

   Recursion  exists  when  a  function calls  itself.	 This  is  analogous to
mathematical induction.

   Iteration is a control structure  present in most languages.  It  is similar
to  recursion but  sometimes less  useful and  sometimes more  useful.	Maclisp
contains a generalized iteration facility.  The iteration facility also permits
those who like "gotos" to use them.

   Conditionals allow control to branch depending on the value of  a predicate.
and and  or are  basically one-arm  conditionals, while  cond is  a generalized
multi-armed conditional.

   Nonlocal  exits are	similar to  a return,  except that  the return	is from
several levels of function calling  rather than just one, and is  determined at
run time.   These are mostly  used for applications  such as escaping  from the
middle	of  a  function  when  it  is  discovered  that  the  algorithm  is not
applicable.

   Errors are a  type of non-local  exit used by  the Lisp interpreter	when it
discovers  a condition	that  it does  not  like.  Errors  have  the additional
feature of correctability, which allows a user-specified function (most often a
break loop),  to get  a chance to  come in  and correct the  error or  at least
inspect what was  happening and determine what	caused it, before  the nonlocal
exit occurs.  This is explained in detail on part 3.4.

   Maclisp does not directly provide "hairy control structure" such as multiple
processes, backtracking, or continuations.




March 3, 1979			     ∪2-4.			       Page 2-35
			   Maclisp Reference Manual


4.1  Conditionals


and		    FSUBR

     (and  form1 form2...)  evaluates the  forms one  at a  time, from	left to
     right.  If any form evaluates to nil, and immediately returns  nil without
     evaluating the remaining  forms.  If all  the forms evaluate  non-nil, and
     returns the  value of  the last  one.  and  can be  used both  for logical
     operations, where nil  stands for False  and t stands  for True, and  as a
     conditional expression.

	Examples:
	     (and x y)

	     (and (setq temp (assq x y))
		  (rplacd temp z))

	     (and (null (errset (something)))
		  (princ "There was an error."))

     Note: (and) => t, which is the identity for this operation.


or		    FSUBR

     (or form1 form2...) evaluates the forms one by one from left to right.  If
     a form evaluates to nil, or proceeds to evaluate the next form.   If there
     are no more forms,  or returns nil.  But  if a form evaluates  non-nil, or
     immediately returns that value without evaluating any remaining forms.  or
     can be used both for logical operations, where nil stands for False  and t
     for True, and as a conditional expression.

     Note:  (or) => nil, the identity for this operation.


cond		    FSUBR

     The  cond special	form  consists of  the	word cond  followed  by several
     clauses.  Each  clause consists of  a predicate followed  by zero	or more
     forms.  Sometimes the predicate is called the antecedent and the forms are
     called the consequents.


Page 2-36			    ∪2-4.1			   March 3, 1979
				Flow of Control



	(cond (antecedent consequent consequent...)
	      (antecedent ...)
	      ... )

     The idea is that  each clause represents a  case which is selected  if its
     predicate is satisfied and the predicates of all preceding clauses are not
     satisfied.  When a case is selected, its consequent forms are evaluated.

     cond  processes  its clauses  in  order  from left  to  right.   First the
     predicate of the current clause is evaluated.  If the result is  nil, cond
     advances to the next clause.  Otherwise, the cdr of the clause  is treated
     as a list of forms, or consequents, which are evaluated in order from left
     to  right.   After  evaluating  the  consequents,	cond   returns	without
     inspecting any remaining clauses.	The  value of the cond special	form is
     the value of the last consequent evaluated, or the value of the antecedent
     if there were no consequents in the clause.  If cond runs out  of clauses,
     that is, if every antecedent is nil, that is, if no case is  selected, the
     value of the cond is nil.

	Example:
	    (cond ((zerop x)	;First clause:
		   (+ y 3))	; (zerop x) is antecedent.
				; (+ y 3) is consequent.
		  ((null y)	;A clause with 2 consequents:
		   (setq x 4)	; this
		   (cons x z))	; and this.
		  (z)		;A clause with no consequents:
				; the antecedent is just z.
	       )		;This is the end of the cond.

     This is like the traditional Lisp 1.5 cond except that it is not necessary
     to have exactly  one consequent in each  clause, and it is  permissible to
     run out of clauses.










March 3, 1979			    ∪2-4.1			       Page 2-37
			   Maclisp Reference Manual
α

4.2  Iteration


prog		    FSUBR

     prog  is the  "program" qpecial  form.  It  provides  tempopary variables,
     sequaftial evaluation od statemeNts, And the ability tk do "gotos." A prog
     looks something like


	(prog (rar1 var2,∧\\R4∀∩Ai¬Nb~∀$@@@AMiCiK5K]hb4∀∩@@AgiCQK[K]Pd~∀∩↓iCNd4∀∩@@AgiCQK[K]Pf~∀∩@@@\X@\~(∩@@R4∀∩∀@@@Am¬dbXAYCddX@\\\↓CeJAQK[a←β∪πKeαβ[πKL3↔~q↓α←F+9βSF)↓βC⊗{≥β'~↓β↔≠&+K↔⊃π##∀4R↓↓↓↓π3π3W/→β/_LεFF/<Tπ6∂-_⊗⊗f↑4ε∂⊗T∧π∞∂lX	¬Dλ∃z]H≥~Tλ≤⊂→≠pπ iS exi@QKH@AQQKrA¬aJ
∀@@@AIKgi←IKHL∪QQJAm¬aSCE1KfACIJAS]%iSCYαKk↔⊃¬#5β;L¬Bπ≡YbπεTππ⊗|pλ∧
<h⊃-n→<Y,Eβ"H∧∧λλ~~8¬s @QQKrA¬aJAgα'↓β&yβ∃α↓βx
 ↔→⊂:7P≠4r↓ bq the proe @@↓⊃@?←-3↔I1∧εf∂⊗α88ML<c"D∧λλλ∞⎇~8r∧
_0% bee8AIKFεcπK⊗ ∧εm>≠]-T≠x	⊂_ε`	←]UZAoSαc "ε,TεNv_¬~,≥~:AD≥≠hε∧λ≠`→λ_⊂∞`4⊂	↓↓α↓β'≠_εF.∞EDαε↔↑@λ
⎇Xε4Pλ4p∞  compIhed A`∂≡ε,⊗o~βHλ∧8π`∃ pπ@#?αPDλ_Y$∧_p<L\β2f⊂_q0∂@*π  (↓Hλλ∧∧≤Y0⊗≡p	`≥∞αβ?9β&C∃β'vKC'πbβ[πH
 2λ0∂f A`}p5L≡X∧pq~2qWεBα~(α↓↓↓ααMε*π≡'D≠yH∀≤≤[l@P0s4er the te@5a@∨K∂∪eβZ∂∪'π`∧Rε~0`:λ4qP4he @E=Ir\∪¬XAS&+ (hα@λ∧∧λ∩ ↔λ8∧hE b`∂I↓Hβ .∂⊂λλLT_;@⊂_z7vtXP9|`-b`∂X↓¬w$_ 7≤tq2@r, whia` ILABAi¬@
 "	pD(⊂↔'[⊗@
     ¬a@∨6¬⊂λDXπ`∩m, whic` I@LABAfπ#πC⊗¬XVwλπεEα¬∀@@@Aae9H
b∧λ,8∧er@AERαs∪'hpλ∧∞α4"Pλ8∧e@[A←eC↔I↓↓β0∧↔-88[↑hε  pr`∨Fα+@∨≡↑4ααε_¬≤d∧_[`∩≡D@
@@@Afε+GW⊗u#'πM@∞%⊂⊂:0Xβs  ¬`∃β_¬6Oπλ	 ∩λ0πve↓Hp
↓↓∞7ε∞¬→0⊗Yu2 ∪ are ↓∃iC@2εP_.9α 1≤¬pλAi!J∩(∧∧ααα∞`_-∞αryP_y2Ph`∂]@>ε,F"r∧	εd≥~⊃∧8π $o`Ai!JAE←α#eβ&α4π,88`4→p∧ _↓∞π,πs@  p¬K@RεP≤MNh∪Z-↓↔
    H`∧@@#⊗+C@.∧[@⊂≡⊂	 @Rπ→β↔↓h≥G\8
2@$, prndεAgi=afA`π∪7∂↔≤ε6NVpλ∀≤9P!7Y<P !nd reQ`↔Kn4πεFQQ"αα∧∧π&∞β⊂~@d p⊂@9αα'2∧¬ε=h≥_,@TP )↓L∪@↔↓hλ;∞↓pr2`$, prndεAU(
Wπ~∞MrαπMBπε_]∧πs⊂⊂≤42P"o`	@DhQ↓↓↓αβ &∞,P
↓2r6¬SaP@β##∃β&⊂~@Hλ∃
(⊂<Lxp
@JεsA↓β&yβ∨≤¬↔4≠S`:λ2s v≤¬ade@⊂A`↔h∩\βs  %`⊃β&ε1P@$λλλ∧π0∂n5Ci←[%F@_Q!P@$λλλ∧λ8
sh`∂k_α!β∃¬f␈&X@λ∞↓40`4↓`∪#∃αα7π∞`¬π>λ≤9≠pπ @Rπ→βπd→/∞α2`.sikf ↓=@→βSF)↓αM⊂n∧λ#@~BA⊂⊂⊂λ⊂897→β _A∩αqβ@&≡Bαε⎇tw4_;Y∧∞Y=≥.0ε'@fA@↔πβ∀ε}≡>Z"εNβHλ
≥|Y(∞α0q`$pεAiQ¬\@A→αK@∨α ↔
F@
     alh	@?←,∧Bbα	
w>8"`2, the Lic@@AG←[ASYKeLAS@7∧c↔7↔w#↔↓βx¬b∧MJ5B∧o]@

≤|kλ≥Y⊂~~2BE⊂λ⊂⊂⊂"⊃ay|`3te`~∩D`AM↑β⊂&'π≤c'OAαβC↔G,¬↔,(≥~≡λλ⊃mt|h⊂⊂[2⊂⊂)→z:y7	yP⊂!→P62l~qpv6≡FEεEβE(0sYP→⊗IN∧@DPλ⊂⊂	YZ∪→∧BDP⊂⊂∪py1tλ→R⊂_N[\FEβ∧DDDQ67{P≠s⊂!w[:97vβEεEεB⊂⊂⊂⊂λ;tz4~w⊂:4→P9qw\2P7sλ:42P≤97sWλ*44yH6pur\P0P3≥w1z4[w⊂;t~qt⊂2≠ryP7≠z⊂1w[:0twβE⊂⊂⊂λ⊂0P(≤7sV⊂_:z⊂;Z4qt⊂→7ryP_ww:0Zw⊂0@→wP7yλ92z:\7⊂:w_wvx4[0q62KεEεEλ⊂⊂⊂⊂∀rrP0[9wP:~2P27H9x2qZpv⊂3≠y6V⊂≥t4qtλ:yryH0P17Y<P9t[tv0yλ:7P8≤7sW∧U42P2≠VεE⊂λ⊂⊂⊂1Xz1t⊗λ0w2⊂≥497{H⊂9x2Xtpv⊂→4πrms are included  in Maclisp as an  attempt to
     encourage goto-less programmiNg style, Which leads to More  readable, more
     easily  mai`≥i¬S]KHAG←I∀\∩A)!JAae=OeC[5Kd@A%b@Ae∃G←[[∃]IKHAi↑@↓kgJAQQKgJ4∀@@@AMk]
iS←]LAS]gQKCHA=HAae=NAoQ∃eKmKHAeKCM←]CE1J\~∀4∀@@@AqC5aYJT4∀~∧∩!ae←NQpAr↓tR@@mpXAr0AtACIJAae=NAmCISCEY∃`
↓↓jβC↔7ε{@⊗∂-≤W
pQ!∩αα¬∞6/'∀∂∩αF<≡"π:∀"αF<N"π:∃⊃ααβ>tεO~⊂ε'⊗\Tπ6∂-_⊗⊗fUaPPNM⎇wh!∀ααα1vv"¬¬εw.MDπJJ¬∞&/'↑-bπB⊃⊃PPH∀¬αFw]IBπR∀¬ε>zZ'αJ∃⊃PPO,]&}NaQ Jα∧¬π≡/N∀πBα9vw~¬6}w4¬ε≡∂$λ∞%∀λ_p.$≡J*!QB""$∂
*#!!(λλ¬∞y=≤$∂(
_lNH≡*!Q@"(∂$
_q∞$≡J*!Q@ λ∧¬→{h
M{|
!Q@9<N↓ B(∧∧
_\L\:h_.,+>;nU<⎇<LWh≥
!Q@(λ∧¬≤y=∞∀≤H≡%⊃"B(∧∧
→{d∞Y:[m≥J*#!!"C"LMb"(∧∧λ⊃TjXTC"AQHλλ∧∧∃~→$≠hλ∞>→8r,≥λ→[n-(≤≤M}Z9→.4λ_ |;Y4L≥~>Y,DλY≠d∧≠≠{n∧H→P,=;~=∂∃α=z.Mλ_;AQHλλ∧∧_<XM≡≤X<O∀≠];,,<H⊂↔Yα "index varaables" whose valu`fA¬eJAg¬mKHA]QK\@↓iQJA⊃↑~∀@@@ASLAK]i∃aKHA¬]HAe∃gi←e∃H@Ao!K\ARβ!β'Mεc↔≠Qbβ%;∃r↓βS#/IβπK*β?Wv!βdO##∃β&y8$)α↓↓↓α&C∃β'v#↔`'6K'π⊗c↔Mβ∂∪∃βW≡+⊃↓βNqβS#*β'S↔⊗S'?r↓βC↔⊗3?K7,!βe∧#=8%∧QβSF(4)↓α↓↓β.;';;Ls≥βSF+eβπ⊗)β';M#'π3OS↔⊃β&yβOC.≠'≠'.!β[πg+↔M1∧;⊃β&C↔9β∂!βS#*β↔;⊃ε{_4)α↓↓↓β.∂!β'∪'Aβ∂∪?W; ↓βS#*β3/?αβS#∃π3π3W/→↓β?2βS#∃εK;∪↔Bβ[πKN3↔~↓βπK*β∂#πv;↔⊂4R↓↓↓↓ε∂∂?⊗#';≤O#=βOε+∂'≠N+⊃↓β↔+3↔Mr↓↓β∪zβπ33␈;E↓β&C∃βC⊗{∨Kπnk↔I↓π#=↓β∨β↔∂'7Iβ∧4R↓↓↓↓πβK↔∪N≠πS∃π;#'∂Bβ∪↔S/∪7';/→β←#.q↓βSF)β'S/∪πS'}qβ←'faβS↔⊗k';π&)9↓↓¬##∃β63W∀hQ↓↓↓αβS-β⊗)βK↔'+K;↔"βπMβ&C∃βK/≠W3Qε{→βSF)β≠?⊗iβ7πJβ?CSN{;π3gIβ∃π≠C↔∂N3'↔⊃ph(4)α↓↓↓β&yβ∂?n+Mβ'rβS←=π3πK'/#'↔Mph(4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓↓M∩iQ9HHH%↓↓α↓↓↓αε∨∃↓∩iMd4P0$$J↓↓α7∞≠3'OααK↔≠-∪↔;∂*α7π;.04λhP4)↓α↓↓αSF)β;↔>+Iβ[∂∪'↔SJβ?→β&yβ3?}[Mβ3N[∃h4Ph(%#&y↓!#6Iβ'vKQβK/β↔πQJq99$hP%↓↓α↓#↔; kS↔O"β↔c'"k≠?Kjq99$hP%↓↓αβ?∪Jq99$hP4)↓α↓↓αSF)↓β≠M∪GQβO#↔5↓∧K9βSF)↓β≠⎇∪5β'~↓β¬βdKOQ↓ε{⊂∩π,↑&xN|$εn␈,TαεNlLWBπl≡&N∞-LPhR∧∧ααπ>V≡Nm≤W.kHλλ\8zα-≥Y→6∧∞X<Z,≤Y→".≡→8r,@4ry⊂~yP0D[4yz≠s⊂⊂*~2P70[pP⊂'Y⊂0FEλ⊂⊂⊂⊂≥0y4`X42P+_y⊗⊂!n  iNitial value init, which  defaulp	fAQ↑A]Rαa↓↓
pD∞≠x|m≤Y≡#!∧λλλ∧∂Y<[eDλ_<d
9;]
≥{Y9∧∧≥;Y↑H≤→≠qT@⊂~q⊂⊂ )p is  kmi@QaKHX↓C]H∪∧@AeKAKChAβ3π3W(h!↓↓α↓βK↔∧+πQ→αα'2∞,Wε.≡@εO~
x-≡≥→1¬D≥~→$∞X<@
≡h≠[nD_z_-ly9⊂_2z;rYw⊂6 /ops.
λ
α     All  asqignment  t`∞Ai!J@ASαs∪↔aαβ[πKL#↔_K'Mβ&{;∃↓∧K9↓β∧KπMLVbp∀λ↔"πMPhR∧∧ααε,\vNvm⊂LT≠yH∞M→(λm<\u∧
=→<L≡~;{ED_;≠∧∞~→(∧
;Z0~≤P0y2H2{0v≥pz2r⊂⊂:4→w⊂:4→FE⊂⊂λ⊂⊂;0\9P0y→P9p{→r⊗⊂ 4hen the vars are seTq'edth∞Ai!JAmC1k@↔Mε{⊂∩πMRαε≥m↔'~d∧¬&xQ$ααα∧∞π/"
~Bε∞mzFF/$
v∂JD∞FF*∞l↔↔~≡&*εL≥V⊗&∃\&␈.l@π&Z∞Mε*πl≥G.<h≠l@⊂⊂:4→P4w4]9WεEλ⊂⊂⊂⊂∪4πte  that the  ifiTq abe	evaluated befOpe  the vars  are bound.	 At The
     beginning of each	succeeding iteration those  varc thathave  repeats get
     setq'ed to  the valeeq  of theip∧@Ae∃gaKGQSmJAIKaKCQfD@@↓≥@∨S*βS#π Kπ31π##∀4R↓↓↓↓¬∪↔C↔∂#Mβπ⊗)β↔[∞cWπS.!β↔4{C∃β∞seβ?2βS#∃π3πKMεK@~ε9⊗v>\@AQ@εE⊂λ⊂⊂⊂*~2P9rXww2→v2vr[:⊂7cλ⊂:42H27Vs≠y2P4\P0P⊂≠4yz≠q⊂0wλ2w2  pesting prediCate
     end-test And zep¬↑A←HA[Oehe valqe od∧AiQ∀AI↑A%fAiQ∀AmCYUJA←L↓iQJ∩1CghA∃qSh[→←eZX4∀@@@A←dA9SXAS_AiQKβ∪∃β←-∪∃β;z↓β↔cM!7≠x-W~Hλ∪M}→(≥
=λ⊂~~2P9rXww2→v2vr[:⊂⊂7Yα the
     do-dkrmp¬KgKαk#↔~β¬β∞x¬f"ε=@λ.↑y+C!↓αA⊂⊂λ⊂⊂$cλ842P≤p¬co9HAKXα+7.β]
|β⊂:4→P⊂3 /p¬BA∩β→βπbaβC#(ε&*ε≤4εvzXLE=→<nDλ≠[n⊂2|4]⊗@
     →←e@7~aβπh@λ∞M→(⊂M|_(⊂↔Yα the do  is eaKGki∃HA←]1rA←]
JP→↓∧K9βSFKEβSLεε*α
x	D≠c"D∧λλλ
≡λ~0→H0s⊂2\αrg@$↓aP≥βF[∃β⊗+C↔π'→1↓↓¬##'M¬#gC∃∧{⊂∩εMtεO~⊂λ∧897`'  wiTh initial
     ralues ≤D4∀∩)α↓↓↓αL1βS#*β@≡8{sLD→;∩Zp¬`≥h↓←DAi!J@AMα{C¬αHε2πεT¬~n←∞πε/>9⊗}r¬
fNb∃Dπ&F↑,Rαε≤4εvxQ$ααα∧λVv"↑LW∨"
z"ε/
~Bn6β|[.∃λ_;LD≥~→$Xπr<H5s⊂*~2P27H4yP2↑2qzz→r⊂7`6er  and over.
     This is  a "do fcrever." The infiNite  lkop can be  teriinated by  use of
     return oR throw.

     The remainder of the do-form constitutes a prog-body.  When the end od the
     body is reached, the nexp iTeration oF the do begifs.  If retuRn  is useD,
     do returns the iNdicated value and no more iterations occur.

Page 2-40			    ∪2-4&2			   March 3, 1979
				Flow of Control
¬

     The older variety @=LAI↑↓Sft~(~∀@@@@QI<AmCd↓S]Sh↓aKaK¬hAK]⊂[iKgPAE←Id\\\R4∀~∀@@@A)!JAMSIghAi%[JAi!e←kO AiQJ↓Y←←`↓mCdA≥KifAQQJAm¬YkJA=HAS]%hv@AQQJAe∃[CS]%]N~∀@@@AQS[Kf↓iQe←UOPAi!JAY←=`ASh↓OKif↓iQJAYCYkJ↓←LAe∃aKCh0AoQS
P∪Sf↓eJ[KYCYkCQKH~∀@@@A∃CGPAQS[J\A≥←i∀AiQCPAS]SPASfA∃mCYk¬iKHA	KM←e∀AiQJ↓mCYk∀A←LAYCd@A%fAgCYKH\~(@@@@↓βMiKH@AmCH@ASf↓gKhXAK]H5iKghASfA∃mCYk¬iKH\@A∪L%ShASL@A]←8[]SX0@AiQ∀AI↑~(@@@@↓MS]SMQKfA¬]HAe∃ike]LA]SX8∪∪LAQQJAK9H[iKMhASf↓]SXX↓iQJA	←IrA=LAiQ∀AY←←@ASf~(@@@@↓KqKGUiKH\%)QJA	←IrA%f@AY%WJAB↓ae←N↓E←Ir8∪O↑@↓[CrA	JAkg∃H\@A%L@Ae∃ike\↓Sf~∀@@@AUgKHX↓SifA¬eOk[∃]hASLAiQJ↓mCYk∀A←LAQQJAI<\@A∪_AiQJ↓K]HA=LAiQ∀Aae←≤AE←IdASf~(@@@@↓eKCG!KHXA¬]←iQ∃dAY←=`AEK≥S]f\4∀~∀@@@AaC[aY∃fA←L↓iQJA=YIKd↓mCeS∃irA←_AI↑t4∀~∀∩!gKib↓\@QG¬Id@Q¬eeCs⊃S[fA`RRR~(∩QI↑↓R@`@ bVAR$@PzA$A\R~(∩∩QgQ←eJ@!pARR`RR@@@@@muKe←∃fA←kPAiQJ↓CeeCdAp~∀4∀∩QI<AutA`@QGIHAutRQ←d@!]kYX↓utR@!uKe←@@QL@!GCdAitRRR$R~∀∩$∩@@@lAiQSLACaa1SKfA_Ai↑A∃CGPA∃YK[K9hA←L↓p~∀∩$∩@@@lAG←]QS]k←UgYrAU]iSX↓LAeKQke]f↓uKe↑8~∀~∀@@@A∃qC[a1KfA←_AiQJ↓]KnA→←eZA=LAI↑h~∀~∀$@@@@QI↑@ Q\@Q
CId@!CeeCeIS[f↓pRRR4∀∩∩@QR@`PbVA$RRR~(∩∩@P zARA8R~∀∩@@@@@Qgi=eJ@Q`ARR@@RR~∀$∩@@@@wiQ%fASf↓YSWJ↓iQJA∃qC[a1JACE=mJX~(∩∩@@@@wKaGKah↓\ASf↓Y←GC0Ai↑AQQJAI<~∀~∀$@@@@QI↑@ QpR@!rR@QhRR@Q9SXRA	←IrR4∀∪Sf↓YSWJ4∀∩@@@@QaI←N@Q`ArAt$AE←IdR~∀~(@@@@↓KqGKAhAiQ¬h@Ao!K\ASP@Aek9fA←M_@AiQ∀AK]HA←L@↓iQJA	←IrXAI↑A1←←afAEkh↓ae←N4∀@@@AeKiUe]fA9SX\@↓∨\Ai!JA←i!KdA⊃¬]HX~(~∀α@@@@Q⊃↑@PQ`R@Qr$@QdR$A]SX↓E←Ir$~∀~∀%SfAS⊃K]iS
CXAi<AiQJ↓ae←N↓CE←m∀@QSh↓I←Kf↓]←hA1←←`\$~∀4Ph*7π⊗≠!↓Mb↓EE]HH$%↓α↓MIi!1H∧HI↓↓↓α↓↓αC∞;∃↓Ii!D4(0$$J↓↓α↔∞≠3'OααK↔≠-∪↔;∂*α7π;.0$λhP4λ∀PI#∪=αA#AβJ↓#→βBA%%↓BCAβAJIβ|O∩Hh!Q NO4	FN↑QQ h⊂⊃Fzπ∧∩αFdαJαα≤λ∂∧∧P!7Y<TFEβ@
     The construC@QS←\~(~∧$F#=↓¬∂αε*¬6'∩∂↓αJαα∪`⊗→<⊂<≡⊂TP∀
0ε`+Xαaβa⊃∀ε⊗↑H∞*↓Q@εE⊂λ⊂⊂⊂%xplo@%afAaαCπMHVbε_∧`→Zqw6r[8⊂:7H4p∞Dex variabl@∃`
r∧	vrπMRαεm⊂≤Nz⊂4@teraDion,
     the Value ob @↑εc∪aαHε2πz_=↑Y<@⊂λ8εalUJA@!∧¬ε∞λ_Y,↓0πre the @⊃ZAoCL@AK≥QKeKλαq↓α⎇aP@$λλλ∧∞⎇0p⊃→p¬di9@
β&αLW,8
4`/ns _α{#∪@∧λ&}wL≥⊗w~∞Mε*πl≥G\αP:4_z⊂< had ↓9\@Ai!JAae∃mS@>αPaPHλλ∧∧~9→.0p∀i@=\\
∀4⊂	↓↓α↓απdλ	-≡~→ →λ30∂@e4A@∨→∧Fj@λ≥~T_[`∩≡P6`|H1sw:_p	`≤Aαs0~εh`→~¬s At a`→X8@A
β∪eβ?0∞F.@H⊂;A⊂¬⊂⊂⊂λ⊂4`∀ep¬C@SLεf*ε≥@	m}X∧`4hi c@C8AEJ@αk7OP∧ -80	6≡P2t8≤αecs@⊃HAK≥QSeK↓`∂∩εNβHλ∞
→(9→x2`!tpε~(∧∧αααλ≥f"ε←	↔αnip≤M↓yP'@& a @]∃nP↔∂'K3∃α∧Mrbε≥lBπ~→(,βr 9is @JεkC@&ε ↔εBα~(JC∪:¬
∂∧≤∧⊂∀_p∧r`RR4P@∩αα∧∧αG↓(≡ ¬y⊂→ y))
	      `4εs'1↓D≠?+MαC∩παλ⊂≤JP0~	() ;e@aa@∪?LεG4≤⊂<L≥≠→0⊗α¬α∩↓α↓↓↓¬
w$λ∧':[4∧ x @A]k1P⊃β∃∃ααα∧π"ε∞>8
@w2b@nt.~∀ 	↓↓↓α↓#v∧Y ≠→y1bP≡⊂TDPλ⊂⊂⊂⊂λ≥z0→@ASGCX↓`↔O∃¬v$≠\Y.l<P	`$(∧∀!∀ααα¬⊃!⊂(λλ∧∧λλ∞MmβP"7Kq0∂dy requireD8∩∧4P@⊗O~	@
-p¬ (mapliSt 'f x `∩∩8∩∧4Ph ⊗>q⊃ααα∧λe≥0TC!
∀@@A&C∃↓λ	{d∞α0s@( spE@λ'π@→M}XεP )pεAkgα+⊃βSzβ∪ :λλ ⊂λαgo-Tm" within↓`∪#∃∧∧&n_@ @9@	↓α∧⊂λMβFEλ⊂⊂⊂/p∧AB↓επ,βs@.AβLAβ##∃β&~ε_∧bXw⊂ z≠vV⊂(t i@&↓]P∨Q∧G&∞β⊂~@ated\α↓α?SD+@↔z0	@d  i@(↓Sf
∀@@@@ε+[πH
 ⊂]2rand  MQ@∨V`∧Bπ∞α9 ⊗→⊂⊂ wλ0r7`-,∧@@AQQK@9∧vjα∞N&∞@Xy@2≤αs C9]`∪K|¬BαπMtπ&FQQ"αα∧∧πεz;U∧
8π⊂ 4he Body @Xα↔M@	,D_PP_P⊂:0Yβ eq↓←d@↓h∧πLπP:4→P7w"H3t`⊗⊃\\@@Q)COLA@↔εβ⊃P@$λλλ∧Y(∩Zz42@2	ato@5SFAfβK7⎇Hdβy⊂⊂≠8¬`≠↓⊗+@↔~α ↔  Af  phere is @9X
↓β≤εV≡α∞L⊗ 4λ∩ ↔λ8∧hE
λ∧@@@AE@?'I1β&α@λ
≡h⊂;D∞αp∞s↓∃K\K∂<[iCNαβ↔K|ε"@aα@

      ¬π←[ββGS⊗∧@λD{i|d∞z∪p~[2⊂!2H0p⊗@↑αC∪↔⊂¬εrε8`6\4pe@⊂AG←I∀XA←∩βπ3S|∧v/&λPE¬∀~(∩(Q!P@*_9y$εK 
	α@@	   ∪$αiQ9HH@%↓↓∧kπK∞@∧β~b∧ ≤Mβ9~∀⊂∩$H@∀6@≠p@ o`Aεεs;@'-x↓↓A

λ∧∀!_GF∞β<βV@εEεBα	(p∩oc (x q z(
∀$α↓#O↔'	βAβ≤¬vN(⊂∪rob)
	looP	α∩↓αβ∪ :∞8m≤αr44[3FE∧↓   ⊃C9HAg←αk∃βC⊗+∪'∂∂#∃↓λ	{dα7w`0))  :p¬KO@,cπIα>x4λ⊂λλMβP9gZp¬`)Q%]NA≠=`∀4PA↓↓λ⎇rαε8`↔→⊂⊂λ(minusp p ∩↓α;3 >x¬Jαε`⊃_wvx*]2r 'o"~∀ λ%↓↓α↓#@"∧|Vv'L≤rJJ⊃Q N8π":_pπ
λ∧@@Ae∃i`↔p∧πRJ⊃Q h↓@εEreturn	↓    S@+∧H@bAβIH4(hQ↓↓↓αβC↔∪(ε&rε_1.↑y0∩ p`∞@Aβ∪↔SW⊗qβ≠K|i↓β¬∞πε≡pλn⊂⊂ @ dk ≤∩↓)QJAYCYkJAP∨→∧ε&/'↑-b?_Q$ααα∧λ↔⊗?]\Vw"∧λ
.P92j≤¬r`≥α!↓βJβCK?8↓β?I∧∧Fzα≡2εON4απ6≥JV*R∧	⊗pN≤LFO&≥pED_XY,≤c"H∧∧λλ→→qwsw~⎇2yP≥42P⊂≥<x2`$-if S-axpressi@=\@Qe∃i`↔Kp↓βKπg+∃%β∨β↔∂'∞c3E8LK⊃βSFKL4)α↓↓↓β









March 3, 1979			    ∪2-4.2			       Page 2-43
			   Maclisp Reference Manual


4.3  Non-local Exits


catch		    FSUBR

     catch  is	the  Maclisp function  for  doing  structured  non-local exits.
     (catch x)	evaluates x and  retuRns its value,  except that if  during the
     evaluation od x (throw y) should be evaluated, catch immediately returns y
     without further evaluating x.

     catch may	also be used  with a second  argument, not evaluated,  which is
     used as  a tag to	distinguish between nested  catches.  (catch x	b) will
     catch a (throw y b) but not  a (throw y z).  throw with only  one argument
     always  throws  to the  innermost	catch.	catch  with  only  one argument
     catches any  throw.  It  is an  error if throw  is done  when there  is no
     suitable cadch.
     Example:

	(catch (mapcar (function (lAmbda (x!
				   (c@=]H@P![S]kM`ApR4∀∩∩∩$∩@@QQQe←n↓pA]K≥CiSm∀RR~∀$∩∩∩∩Q`⊃↓F1βa¬J↓%%$hP$%↓α↓↓↓↓πI$4(J↓↓↓↓α↓β;↔>S'[*H4(∀R↓↓↓↓π;#'∂BβK↔S,ε&w~∧∩εf≡>Bαε|dε2ε|dαε.≤=αε.L]V.wD∧ε}∩∂∀εN2∧∂∩εO4∧ε∞fD
ε␈≡≡M↔6*AQ"αα∧∧ε␈&Z'>O<Tπ&FTfO↔>Dεv.|≡FO6T
V.n,↑"ε}d∂∩ph!Q"αα∧∧¬&FT∧π/≡↑!⊗}28↔&≡∧∧ε∞vD∧πεG-}rεO4∧ε∞≥Z4l\λλ≥
t≤⎇~,=hλ∃
q=~→$∧H⊂.,⎇;9-nβ"H∧∧λλ≥L↑\z3mniλ∃m
8zλ≡Y(≠Mt≠→<n4λ→1Lm8z1-nλ⊂-lλ≥→-lλ≥≠d∞Y9≥,<(λ∃
(≠∀Zβalihood
     of bugs ≤@↓)QJA=]JACIKk[K9hAmKIcSO]LAKqSMhAae%[CeS1rACF↓C\AKαGeβ>e↓β&yβ≠'@h)↓↓α↓β?3 α3'Oα↓βCK};Cπ↔~β←#'≡A↓βW≤)β↔K↔≠↔Q↓ε;⊃β/∪I↓β6{Aβ;}q73?≡1↓β/C'SMr↓αS#O_4)↓α↓↓β3∂#S↔I¬βCπ∂&K∂∃βO→βKπ&C↔H'≡{;≠W≡K;≥1∧∪↔∂π-≠∃β↔↔⊃βπ≠"β↔KK≡+Q↓β∂∪∃βO/βC?O. 4)↓α↓↓βSzβ∃β/≠↔⊃β4{Iβ↔↔∪?IβF;∪3Ns≥1βv{Qβ∨.s↔KπbβCK??∪π5β≤{;SK}a04(hQ↓↓↓ααS#∃ε≠πS∂@kSπ≥ε∪K↔πZβ'Mβ/≠↔⊃β↔IβS#*βK↔∞Yβ≠Wv≠S'?rp4(∀Ph(4(hP4(4Ph(4*ε∨∃↓∩iQP$HI↓↓↓↓→I5Qs_$$%α↓α7π⊗≠!↓Mb↓Ee]Hh(0$$HJ≠3?:β?→α≡{;SK}`4(4Ph+S#⊗{\$%α↓↓α~≥*
H∀Ph)↓↓α↓βS#⊗{]β'~βWO↔"β←'SBβ∂πS≡AβπMε	βOS↔+∂SW⊗+⊃β;}q73?≡1β↔FKQβ7,≠#π;O≠584Ph)↓↓α↓↓#SG∪?]βBIβ↔[∞cWπS/→βaβ∞s⊃βSG∪?←Mπ##∃β63W∃ε∪π∂-π#=βSF)β7?∨!βK↔≡+;Qβ≡S∂!ph(4)α↓↓↓↓G##K?:βaβS∞9%βSG∪?←Mπ##∃β63W∃ε{→βaε∪π∂-π#=βSF)β7?∨!βK↔≡+;Qβ≡S∂!εcπ↔dc↔⊂4R↓↓↓↓π;'S!π#π
↓ε{AβWvcπ↔dc↔⊃_N≠πS∂@;↔Mβ>KS!β&∨M↓εs?Qβ-	↓βSzβSπ≥αβπK∃π≠/'C∧+⊂4	α↓↓↓β␈3↔I9αβaβ'~β↔[πg+πS↔ βWQ¬#π
βM→β;>"p4(∀R↓↓↓↓¬≠↔∃β&C∃β∪-≠∂Kπ↓#'?9ε{⊂∩ε<≡F≡Biwαεn↑'&F↑ λL=_:-NiC"AP@εEεBAεEβA

λ↓


α~∀4∀∀(hP4λQ!P@λ!Q h⊂β"C!αEεEβE

λ
∀~(~∀4Ph*7π⊗≠!↓Mb↓EE]HH$%↓α↓MHhεBc_⊃⊃∩αα∧∧αα¬λ≤v*β!P
εQ"@↓↓ "(∧∧⊃88mM<|λ
,9Y →→w1rP∪ps:p[∧@


α4.P@AπCU`∂πlpλ≥Yλ⊂m⎇]_[mLα4w3H y ∩op¬f~∀4⊂λ∧ ∧α¬≡XTπ&FTλλm⎇<≠⊂∩]2P22\qy4x≥4sw o`Ai!JA↓∞≠3'Oαβ↔K⎇⊃βO@≤8
](
≤≡YeFλ(∪≠y⊂&w\2BEhnfgrmation aboUt ho\AiQKMJAMk9GiS←9bAo←IP
λQ!PF/,-wHα(λ∧∧⊃∀u(
Hλ⊂≤0π # argc
λ	∀@@A	!SfARβ→β¬α0εVv∨M_md≥z~,=λ_;
β{qP≤yry `¬`↔h0

≥{\h∞LπP9dXβnal theiH@A←@>qβ↔
α-w.c"H∧∧λλ∃.≤∧p∞@NαβS#∃∧kπ∂3M≠Aβ↔↔∪?Iβ≥KGS⊗h¬`hPβ"H∧∧λλ
↑\[p→
P4qP≤42P)XvrP \β  ⊃
π∪@∩
aQ H↓Hλλ∧∧λ∧"@2p¬@∨I¬V/∨<≤v*J∞9⊗=X;∀d∧_ 9Zvx6 % ebbop; no  datum I↓LAaeSαsS↔⊂∧∧⊗v ≥mrπ∞8XA⊂Hλλ∧∧~;]↑XX
`0t ic pπ@'∨v3#⊗∧@D∧∃~→$<X[n⊂6r`3pπCOJ↓icaKα!β/W"β'Mβn+GOπ>)0 (!Q"αα∧∧αF/(∧[n⊂6r`3pπCOJ↓ICI,¬RJπ=_vv∞Hh≥Hλ→.90∂bwithi`Gg¬K@∃α∂→βC#*β'/><⊗.
∧λ

t_Y#!∧λλλ∧∞_∧`⊂Ed oeT a`≥λαβ∪πSαX$<h⊂~~2P&$\βp oBhectph∞AE∀AaeS9iKH@αC9βSF)β↔K⊗{@∩ε\Xn≤9y+AQHλλ∧∧⊂π7P≥yry~w:2i≤αpAh↓SfAg%@∂;πd¬F.αβC"A⊂¬⊂⊂⊂λ⊂⊂λe↓I`∂I∧¬V/∨<≤v*εL≡G.j∞Y⊗wαβ0p∀≠∀P9`)`π]CYL@AC\αβ↔KK|ε"ε↔↑@λ4y0∪@PAgSO9CYf@↓BAkgα+@⊂ @λ∧∧λ~3NL<X	:\8⊂7`. channelUS]h[
Q\XAAaWmSα#↔↓β&CπQβ&C↔K∃∧K@~π>Xλm∧_(λ=_;[L]λ0[2εE⊂λ⊂⊂⊂$\⊂40yH0P77[⊗w4@,  seRvice dpMGβ#'?9bβπ;⊃¬##∃β∨β↔∂'∞a↓β∂x¬f&OM→vw~8mly<[M≥Yc"D∧λλλ↑XX	`%t  see page 3-⊃4∧RAβIJ@Ag¬iSgLαK↔↓→αβWπ≠"k∂#9εK@~πMRεV≥\Rε↑d∧π&FT∞W∞∞%QPRα∧∧αεNnLW.]<∃∧z_;Ml;λ~≠P12P≥yrbλ∀0w_z7vtXP9|fX7v∀]H9rrP≤0y: 3.4.∩,	 If the
     service function retqrns an atom,	error goes aheAd and signals  a regular
     error.  If the service function retqrns a list, @∃ee←d↓eKikI]fACLASif↓mCIk∀~∀@@@AiQ∀AGCd↓←LAi!ChAY%gh\@↓∪\Ai!SfAG¬gJASPAoCf↓B@EG=aeKGQCEYJλAKee=d\∪)!SfASL~∀@@@AiQ∀A←]YdAGCg∀AS\@↓oQSG AKee=dAoS1XAeKQke\vAS\A¬YXA←QQKdA
CgKfAG←]Qe←XA%f~∀@@@Ai!e←o\↓ECGV↓i↑Ai=`AYKYKXXA=dAi↑↓iQJA9KCeKMhAK]
Y←gS9NAKeIgKh\4∀~∀~)Keeg∃h∩∩@@A
'U¬$~∀4∀@@@A)QJ↓gaKG%CX@A→←eZ@!Keeg∃hAM←IZ@AM1CNRA%fAkg∃H@Ai<AieC@AC\∪∃qaKGQKHAKIe←d\4∀@@@AKeeMKhAKYCYkCQKfAi!J@AM=eZ\@↓∪LAC8AKee=d@A←
Gkef↓IkeS9NAiQ∀@AKm¬YkCi%←\A←_~∀@@@AiQ∀AM←e4XAiQ∀AKee=dASf↓aeKm∃]iKH↓Me←Z↓KgGCAS]NA→e←ZA%]gSI∀AiQJAKeeMKhAC9H~∀@@@AKIegKh↓eKikI]fA]%X\@A%LA]↑↓Kee←IfA←G
kdXA∧AYSgPA←LA=]JAK1K[K]PXAiQ∀AeKgUYh~∀@@@A=LAiQ∀@AKm¬YkCi%←\XA%fAeKQke]K⊂\∪)Q∀AeKgUYhASL@AYSMiSMS∃HAg↑AiQCPAiQKIJ~∀@@@Ao%YXA]<AC[E%OkSid∪SLA%hASfA]SX8∪KeeMKhA[¬rACYM↑@AE∀A[CI∀Ai↑@↓eKikI\AC]d~∀@@@ACe	SieCIrAmC1kJAEdAkgJ↓←LAi!JAKeHAMk]
iS←\8~∀~∀4∀~∃!¬OJ@d4hl∩∩$@@@@LdZh\P∩∩∩@A≠Ce
P@fXbrnr4∀_∩∩∩%
Y←n↓←LAπ=]ie←0~∀
∀4∀@@@A)QJ↓IYCN↓SfA←AiS←]¬X\@A%HAae∃gC]h0AShA%bAKm¬YkCi∃HAEK→←eJAQQJAMα{C%9αα'2
~@hR∧∧ααε≡4εvNEDεvz∧λW.[|H
\<|x,|(≥z-Mα⊂⊂1→P894[:2b~s⊂⊂0[⊂2y9≠y⊂7`#curs  during the
α     eValuation od∧AiQ∀AM←e4\@A∪_AShAαK@~εmzBεv≥EBε␈$	⊗"ε≡DεO~
⎇VO'L\Bbα≥gJε↑.&␈⊂Q$ααα∧
V/∨<≤v/~|Vv/,≡F."∞⎇⊗fB,Rππ-≥g&.EaPPH$∧αααλ←ε∞o
HW7A"C!$λλλ∧	9H≡-}(_<LT≠[u∧∞⎇<Y$∂λ~<d(≠]-\Y<NAQA"B!⊃(λ
↑\Xy.D
≤y.N(≡¬9→$∂λ"*!QA"H∧∧λλ∃

<h→/9<≠Tλ≠8/∀≠[u∧∧≥{|MP4w_wvx4Z2r⊂⊂_wr2P~q⊂⊂ 4he c=[aSY∃`@AGαC??O-→βS<hQ↓↓↓αβ?C⊗p¬V≡}LTπ&FTλ⊗&#∀λL≡~→4A≡~_;Dx;∪
≥Yh≥
(_9F(≤u,.Y⎇ ~~w2Wλ⊂ w_βafeRal,
     one must @	J@AJaaeK[∃YrA
α{?3#∂∪∪eβ&yβ∪↔∧+;⊃↓∧{9β↔↔∪?Iα≤¬ε.≡=→f*α
→bε≡⎇↑εNf\APBα∧∧αε≡|LR`@ C"D∧λλλ
Mh≤u.∞≤Y4nP:42H2y17\⊂6ri\psrP~pε the valq`
A≡α1β¬αHε2εVβp∩_w⊂0z≠vtqP≤|p
bol:¬

λ	↓	    (errse@P@QgKPABA∧αAβ+πbH4(  error which is  handled the same	as a Lisp  error except
     that there is no preliminary user interrupt, and no message is typed out.

     (err x) is  like (err) except  that if control  returns to an  errset, the
     value of the errset will be the result of evaluating x, instead of nil.

     (err x nil) is the same as (err x).

     (err x t) is like (err x) except that x is not evaluated until just before
     the errset returns  it.  That is, x  is evaluated after unwinding	the pdl
     and restoring the bindings.

     Note: some people use err and errset where catch and throw  are indicated.
     This is a very poor programming practice.	See writeups of catch and throw
     for details.

March 3, 1979			    ∪2-4.4			       Page 2-47
			   Maclisp Reference Manual
α













































Page 2-48			    ∪2-4.4			   March 3, 1979
				Atomic Symbols
	


¬
5.  Atomic Symbols

	α5.1  The Valu`
Aπ∃YX~∀4⊂~∧@ACG ACi←5SFAge[E←X↓QCfA¬`∂O?≤KπS↔ ∧π>OMεO"⊂π6∞LXRε≡]IBbπ⎇
⊗≡B
≡2ε
∧∞εN.<Tε}0Q*7&@|X9lT≥~_.D_x;D∞Y9Q.$≥≠h
⎇Y(∪
≡|λ∪l-Y8⎇¬Dλ∃~
≡h≠xM,8⎇λ
≡h_p-M→9⊂λ:42P≤βyebol ∂f~)mCI()1βOLs∂¬αM!β'M¬;#πP∧K@~π,↑G∂⊗βY ∩λ4s⊂ 4he symbol is evaluated ≤@↓)QJA	S]IS9JA←L4⊃Ci←αk'&α?⊗n⊗⎇J2απMtαπ⊗≥JV/~≥Ff@⎇|h∧∞~→;$∧≥≠h∧Y(∃.≤9λλ
≥Hλ≤∞-y|X-]:;Ya≡~→(∞|>#"D∞β0y4Xq62iH⊂0y2H8qr`$ if Other ha`≥∂UCGKf8~∀
∀@A)Q∀AeCYUJAG1XAGC8ACYG<AEJA∃[air0AS\A]QSGP↓GCgJ↓iQJAMs[E←0AQCf↓]↑@AYCYkJ↓C]H~)SfAg¬SH@AQ↑AEJ↓k]E←U]H∪←HAkM	∃ISMK⊂\@A)!Sf@A%`
βSF)β'≠M#'π⊃αβOSπ&)β/→αβ¬β;-;3e4hS∂K↔∂#↔⊃↓∧S/7L→βOgn∪?19α↓απS&+7CSLs≥βSz↓β↔[∞cWπS*βπ9↓π+;∨*s⊃βONk?1αβ∂πW≤+Eβπph+↔K⊗{AβSzβ∃β≡K↔;πfc↔⊃_hP4)↓ααπ9β|∪+↔∂"β∂π9ε∪∃βCf∂↔⊃∧K;S=αβ¬βONk?1?→β[πg+∃β∂.c1βJβ3π↔⊗#¬7Ns∪';8∧αε␈$'Hh,≡7≡N⎇mV.wE`ααE<XRαπ≤v*β∃V∪~r⊃∀¬&FTFN6lZ&.v<TαεO4
⊗pN
zrε≡M}6.g∀∧π&FT∞f∞g\UPhV=⊗v>≥lrεO4↔∨≡|=⊗∂&\Dπ>OM∧ε≡}nN&}b∞>G↔.>NW⊗*≥f"ε≥dπ>F↑Mε/∩
≡BεO46}w=≤F/⊗\Dελh.=⊗&*\\f6.>E`hPQ!PW≡↑N⊂HJ∧∧α∧5:X%⊂h!Q"αα∧∧¬&FT∧π≡/N∀π∨ε\=⊗∞`≤mw⊗j∧
↔~π↑<V"α∞Mrαε≡>6N>d∞f∞g\↑2απMtαπ6≡-⊗∞⊗L↑2αF≡MvnN1Q"αα∧∧π∨N\-vg~e∀π≡/N∀ππ⊗|<W∨≡↑4π&FT∧ε.f]\Vw'4
v2ε≡N2ε6}-RεNd∧πε∞≡.2bπ<↑↔..nM⊗∞fO⊃PRα∧∧αε7-⎇Rεf\n@O&t∞&N>∞Ebα¬MPN6≡.7"ε\]V⊗/$∧ε}2\⊗≡B∞⊗O∩∧
↔~ε∀∧π6∂-≤⊗⊗fUDπ&FQQ"αα∧∧π≡.=⎇f"ε≡4ε
εm}&jπ⎇
⊗≡B↑f∞g\≡F/~∧∞Fzε∀∞f∞g\Ubα¬MRε6}-RεO4∧ε/6≥NV∂&\EBε↔↑APRα∧∧απ&Tπ6∂-≤⊗⊗fT
↔~εm}Brα
Mε*πl≥G.*\-⊗v&≥lrε}d∞FF*∞l↔⊗N≤-F*ε≡4εn∞LTπ&z∧&*πMPhR∧∧ααπl≥G.*∞>ε.≡≤m⊗."d∧¬N␈T
W/∨D
f␈"∞<W'
∞Mε*π>V≡N≥Dε∂&⎇]⊗~o?≥V⊗}D∧ε≡}n>F∞wN4π h$∧ααα≥f"εm≥Brα
Mε*πl≥G.*∞,W'/-lV"ε/∀π≡/N∀εO~∞Mε*εL≡7"πl≥G.*≡7≡N⎇lV"b∧
∩v*d∞FF(Q$ααα∧∞&/∨]NBε}d∞FF*↑f∞g\≡FN}d
v2πMRεf≡>Bε.L]V.wD
v2πMRπ≡↑N∩n6}-Rph!Q"αα∧∧∧/F≥↑εf+$∧αG≡↑N∩πB¬¬2β
ε$β~J∂∀αF≡⎇n2πB
m⊗bJ⊃Q hR∧∧αα¬M
↔~π,↑G/⊗n4αC2∀⊗v"⎇↔6/4∂αε
∞l⊗g.T
v2βd⊗v"∂∀ε
πl≥G.*
|bαCe∃`hPQ$ααα∧	f␈&T∞FF∂D∞FF*m↔↔∨D∧ε∂∨=≤vvn]nBεO46}o
LW&.D&.6},Rπ&Tαπ≡\=vv"≡7≡N⎇mV.wAQ"αα∧∧εO~∞>F∂↔L\Bbπ,↑7.gM≥f:ε≥dπ&FT∞6.≡⎇lBπ/<Tε}2∂∧ε>/NM⊗v:∞Mε*πl≥G.*≡7≡N⎇lV"ε≥aPRα∧∧απ&Tε6O.>Bπε≥≡"ε}d∞FF*∞<W'
aQ hT\≡&≡Bε5Bβ⊗w⊂HH∀∧αααα6"k*a⊃⊂Jα∧∧ααα
⊗>*ε%S#HQ `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hW<↑@HJ∧∧α¬≥X*"β∩≡&?_Q!PRα∧∧απ≡↑DεO~∧
FN↑T∞6/'∀WF≡↑
BαπM↔"πMRε6≡.7"α≡&?.\]g"ε≡4ε/6≥NV∂&\C2αε≥N6zπ<↑@hR∧∧ααε⎇mGJπL≥6/~
⎇f*π≥↔∩ε|dε∂⊗}]V.wN5`M&Tε6O.>Bε∂,}Vn.nDεo/>Dε/6≥NV∂&T∧π&Z≥`hR∧∧ααε≡MvnN4∞7Nn-⎇Bbπ⎇
w≡
∞l⊗g.T
↔
ε=⊗v>\@π&z∞Mε*πl≥G.

xbπ&Tπ≡∞=⎇f"ε≡,w.n]nBph$∧ααα∞<W"π,↑G∂⊗n4π&FT∞f∞g\Tε}2
~G
π<\6}vD↔⊗?]\Vw"d∧∧/F≥↑εf+!Q hP∀∧ααα∞<W"α8mlλ

∞∞Y9~,<=→*$∧x9≠mV*(
∞D	x=
⎇,J*!QB""$}⎇_X%⊃"C"D∧λλλ↑X;≥,≡→<h∞LβP9z_0P w→⊂3t{→yP2d]42y⊂_z7vXH7y⊂0]7vY⊂_P;0v≥pP7cλ9z10KεAεEαyrz⊂_wzv2λ40{2H12rwλ22s )ned by:¬

	(defun set (x y)
	    (eval (list 'setq x (list 'quote y))))

	AlternativeLy( setq could Have been defined by:
¬
	(defUn setq fexpr (x)
	  ((lambda (var val Rest)
	     (set var val)
	     (cond ((null rest) val)
		   ((apply (function setq) rest)) ))   ;if more, recurse
	   (car x)
	   (eval (cadr x))
	   (cddr x)))


symeval		    SUBR 1 arg

     (symeval a) returns the value od  a, which must be an atomic  symbol.  The
     compiler Produces highly optimal  code for symeval, making it  much betper
     than eval when the value of a symbol needs to be taken and  the particular
     symbol to be used varies.









Page 2-50			    ∪2-5.1			   March 3, 1979
				Atomic Symbols


boundp		    SUBR 1 Arg

     The argument To boundp must be an atomic symbol.  If it has a value,  t is
     returfed.	Otherwise niL is returned.


Makunbound	    SUBR 1 arg

     The  argument  to makunbound  must  be  an atomic	symbol.   Itq  value is
     removed, i.e. it becomes unbound.

	Example:
		(setq a 1)
		a => 1
		(makunbound 'a)
		a =≡ unbnd-vrbl error.

     makunbound retqrns its argument.


























March 3, 1979			    ∪2-5.1			       Page 2-51
			   Maclisp Reference Manual


5.2  The Property List


   A property-list is  a list with  an even number  of elements.  Each	pair of
elements constitutes a	property; the first  element is called	the "indicator"
and the second is called the "value" or, loosely, tndicator
is generally an atomic	symbol which serves as	the name of the  property.  The
value is any Lisp object.

   For	example, one  type of  functional property  uses the  atom expr  as its
indicator.  In the case of an expr-property, the value is a list beginning with
lambda.

   An example of a property list with two properties on it is:

		   (expr (lambda (x) (plus 14 x)) foobar t)

   The first property  has indicator expr and  value (lambda (x) (plus	14 x)),
the second property has indicator foobar and value t.

   Each atomic	symbol has  associated with  it a  property-list, which  can be
retrieved with the plist function.   It is also possible to  have "disembodied"
property  lists which  are  not associated  with  any symbol.	These  keep the
property list  on their  cdr, so  the form  of a  disembodied property	list is
(<anything> . plist).  The way to create a disembodied property list  is (ncons
nil).  Atomic symbols also (usually) keep their property list on their cdr, but
you aren't allowed to  know that.  Use the  plist function to get  the property
list of a symbol.

   Property  lists  are  useful  for  associating  "attributes"  with  symbols.
Maclisp uses  properties to remember  function definitions.  The  compiler uses
properties internally to keep track of some of what it knows about  the program
it is compiling.

   The user familiar  with Lisp 1.5  will want to  note that the  property list
"flags" which are allowed on Lisp  1.5 property lists do not exist  in Maclisp.
However, the same effect can be achieved by using properties with a value  of t
or nil.

   Some property names are used internally by Maclisp, and should  therefore be
avoided in user code.  These include args, array, autoload, expr, fexpr, fsubr,
lsubr,	macro, pname,  sublis, subr,  value, used  by the  Lisp  system proper;


Page 2-52			    ∪2-5.2			   March 3, 1979
				Atomic Symbols


arith, *array, atomindex, *expr, *fexpr, *lexpr, numfun, number, numvar, ohome,
special, sym, used by the compiler; grindfn, grindmacro, used by the grinder.


get		    SUBR 2 args

     (get x y) gets x's y-property.  x can be an atomic symbol or a disembodied
     property list.  The value of  x's y-property is returned, unless x  has no
     y-property in which case nil is returned.	It is not an error for x  to be
     a	number, but  nil will  always  be returned  since numbers  do  not have
     property lists.
     Example:

	(get 'foo 'bar)
	  => nil		 ;initially foo has no bar property
	(putprop 'foo 'zoo 'bar) ;give foo a bar property
	  => zoo
	(get 'foo 'bar)		 ;retrieve that property
	  => zoo
	(plist 'foo)		 ;look at foo's property list
	=> (bar zoo ...other properties...)

	get could have been defined by:

	(defun get (x y)
	  (do ((z (cond ((numberp x) nil)
			((atom x) (plist x))
			(t (cdr x)))
		  (cddr z)))
	      ((or (null z) (eq y (car z)))
	       (cadr z))))

     This relies  on the  fact thatthe  car and  the cDr of  nil are  nil, and
     therefkre (cadr z) is nil if z is nil.


getl		    SUBR 2 args
¬
     (getl x y) is like get except  that y is a list of indicators  rather than
     jqst a single indicator.  getl searches x#s property lIst until A properti
     whose indicator appears in the list y @%fAM←U]H\~(~∧
∀4∃≠Ce
P@fXbrnr$∩∩@@@&dZT\d$HI↓↓↓α↓↓αC∞;∃↓Ik)L4(0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)↓α↓↓αSF)βC?↔#'?9ε{⊃βa?→βCK␈β↔KSJβ3'O"β↔∨Ns;';8β←'SBβS#∃ε3'KO"βGW∂BβCK?ε+CSeεKL4)α↓↓↓β⊗+SGKv+⊃8&&C∃β∂∂⊃β?→π##'Mαβ'Mβ&C∃β'v#'∂π&{I↓#π∪?C↔↔#eβ;∞k∃%β∞s⊃↓β&C∃β∂∞#H4)α↓↓↓βO→βS#*βCK?ε+KSeπ3π3W*q↓↓β>+S1β⊗+S@/-n2εv≥DεN2∧
f}vT
v $≥~→$
;Y~,<=≠|N∀λ~;D∂#"H∧∧λλ_.∞→8<D
{H≥
(≤≤M}→<]∂∀≠~<nD≠yH∂¬B9y.Mλ_{n]→λ~≡Y(_L\;H→\Z;Y,D_↑.AQA"B%→9]-d→y=
D
≡λ∞
#"A∀λλ
Mh

∞∀
≤≠
≡⎇λ≡¬∀
_yNH≤*%∃(∞`∞<x;HM⎇{H
¬;~<nD≠yH∂↓"B(∧∧λλλ∧¬
≠|D¬≠];
D≤*(¬
9;<$¬_x<D∞*(≤
E*#"A⊃<**%⊃"C"D∧λλλ
M~<hL9Z;M≡~;{D∧~<h∞=;<≠
≤Z99∧∧_;Y∧≠y<md⎇λλ∞L:y(
n;8Y..b8;LD→~<l]8[y
≤9β"D∧λλλ∞∞[|→..≡(≠
≡⎇≤h
≥]≠h≤x{u-nC"AQC"\∞↑≤≤[n↓"(λ∧∧∀u0J$h_.,|c"AQHλλ∧∧
≤≥.N≤[|∧∂λ≡(∧∂J(→m≡Y<h∂∧_(λ∂%<≤[n<]≡$
yH≡$;Yλ∧∞Y=≥.-\h≡%dλλ≡∧
8>(∧Y(_-a"Hλ∧∧λ_=
⎇:8h∧∞};8M⎇λλ≠n∧λ_(∧~<y-\[y~,\λλ≤∞-|→<NO(λ≠
≡⎇H∧∧⊂9]↑Hλ≤m⎇98[lO(→≠l↑c"H∧∧λλ
∞∞=_≤M}λ≡λ∂∀≤J+∧¬→y=∧∂λ≡J$∞z;≠∧∞Y=≥.-H≡+AQC"H∧∧λλ⊃/;<≠WC"B!⊃(
≤∞↑≤≤[n∧	sZ/
{H	mm⎇λ	l>[{ze⊃"C"D∧λλλ	≤H≥~T≤};,-{λ_-NY89∂∀~_<d(λ≤∞-|→<NO(≥z.Mλ≥~T≤x;,T≠X;,T≥~_.Dλ≤≤M}→<]∂∀~<c!$λλλ∧∞Y;;nl9λ→M≡\⎇D∧∃~~.4→;\n↑Y<h∞M_=λ|=≠λ∞⎇;≠λ≥≥x>.4→Z;LD≥~→$∞≤[|↑]≡(∞⎇~8z↓QHλλ∧∧≥x<d∞≥=λ
⎇H≠;n>λ≤Y,<;]≠∂∃B1[n$λ~;N>_;XlUλ~9D∂;⎇(∞|<Y(∞Mh≤Y,L9Z;LQ8;H←≤≤C!$λλλ∧<h_$∞⎇8\ED_;Y∧∞~→;D∞Y9→,m;Y(∧
=λ_.4_;H←≤≤H≤x:;ED≥~~.4→9YL\⎇λλ
|H≤≥.N≤[|↓QHλλ∧∧_x=.<<h≥
(→=L≥≥8=
}H≥≠dZ;Y∧∞~→(
L=→<nD→→9M≥Z=~-⎇H_;∞|><kAQC"H∧∧λλ⊂!≥~<|∧∧→→9M≥Z=~-⎇H≠yD∧≥~→$∧_X<m≤h≤≥.N≤[|∧∧≥z=

⎇=λ∧∞~→(∧{{<
M8x=
≥{\h
|C"H∧∧λλ≠N]8Y<N4_;Y∧~<y-\[y~,\λ≤≤M}→<]∂∀≠~<nNh≠:,⎇≥λ_LWC"C!!*→→,n;H≤∞↑≤≤[n∧
≡λ∂∀≤J#!!(λ
∞,;<≤M}λ≡λ∂%#"B$∧
≤y.N≠~<nD≡λ
={\h∂$
_smnh≡(¬∞≠~<nD≡
*%∃#"B$∧≡*#!!"C"AQA"C!!"C"AQT_9lTK-&A""(∧∧λ∧lEV+LB!⊃(λλ	\<Xz∧εkλ'⊗n#"@↓A"""(≡≠{:,4∀};,-{≤c!!"C"LL9\≤M}α"(∧∧λ⊃TjXTC"AQHλλ∧∧→→1N∞[|λ∧
<h_$∧≥Y<N=;{H
|B8≥.N≤[|∧∞z=~∧∧≠[h≡Y⎇3,]]9.l9≥8.M;{K∧∧≥z~,=λ~<aQHλλ∧∧≤{{,↑~;9.4≠;tLT_{sNl;Z1-nλ→[n$≥≡<
≥YkH∧λ[|H
≥\⎇_-ly+β!!"B"!∀λ
→\\≤[n∧→[{dX<H
|]→;N⎇=~
!QC"H∧∧λλ~.∀→<=-≡X;→-nλ≥≠aQC"B!⊃*≤≥.N≤[|∧∧y[sd∧xX<D∧{y]]]z=
¬

remprop		    SUBR 2 args

     (remprop x y) removes x's	y-property, by splicing it out of  x's property
     list.  The  value is  nil if  x had  no y-property.   If x  did have  a y-
     property, the value is a list whose car is the property, and whose  cdr is
     part of x's property list, similar to (cdr (getl x '(y))).

     x may be an atomic symbol or a disembodied property list.	Example:

			     (remprop 'foo 'expr)

     undefines the function foo, assuming it was defined by

			     (defun foo (x) ... )


plist		    SUBR 1 arg

     (plist x) returns the property list of the atomic symbol x.


setplist	    SUBR 2 args

     (setplist x l) sets the property  list of the atomic symbol x to  l.  This
     is to be used with  caution, since in some implementations  property lists
     contain internal system properties which are essential to the  workings of
     the Lisp system.





March 3, 1979			    ∪2-5.2			       Page 2-55
			   Maclisp Reference Manual


5.3  The Print-Name


   Each atomic	symbol has  an associated character  string called  its "print-
name," or  "pname" for short.	This character string  is used as  the external
representation of  the symbol.	 If the  string is typed  in, it  is read  as a
reference to the symbol.  If the symbol is to be print'ed, the string  is typed
out.

   See also page 2-85 for some other functions which have to do with pnames.


samepnamep	    SUBR 2 args

     The  arguments  to  samepnamep  must  evaluate  to  atomic  symbols  or to
     character	strings.  The  result is  t if	they have  the same  pname, nil
     otherwise.  The pname of a character string is considered to be the string
     itself.  Examples:

	       (samepnamep 'xyz (maknam '(x y z))) => t

	       (samepnamep 'xyz (maknam '(w x y))) => nil

	       (samepnamep 'x "x") => t


alphalessp	    SUBR 2 args

     (alphalessp x y),	where x and y  evaluate to atomic symbols  or character
     strings, returns t if the pname of x occurs earlier in  alphabetical order
     than the pname of y.  The pname of a character string is considered  to be
     the string itself.  Examples:

	       (alphalessp 'x 'x1) => t

	       (alphalessp 'z 'q) => nil

	       (alphalessp "x" 'y) => t

     Note  that the  "alphabetical order"  used by  alphalessp is  actually the
     ASCII collating sequence.	Consequently all upper case letters come before
     all lower case letters.


Page 2-56			    ∪2-5.3			   March 3, 1979
				Atomic Symbols


pnget		    SUBR 2 args

     (pnget symbol  n) returns the  pname of  the symbol as  a list  of fixnums
     containing  packed n-bit  bytes.	The legal  values  of n  depend  on the
     implementation; in the pdp-10 implementation, 6 (SIXBIT) and 7 (ASCII) are
     allowed.  If this seems obscure, that's because it is.  Example:

	(pnget 'MUMBLERATOR 7) =>
		    (-311246236550 -351327625542 -270←33)


pnput		    SUBR 2 args

     This is a sort of inverse of pnget.  (pnput (pnget foo 7) flag)  returns a
     symbol with the same pname as foo.  The symbol is interned if flag is non-
     nil.




























March 3, 1979			    ∪2-5.3			       Page 2-57
			   Maclisp Reference Manual


5.4  Interning of Symbols


   One normally wants to  refer to the same  (eq) atomic symbol every  time the
same  pname is	typed.	 Maclisp implements  this  through what  is  called the
obarray.  The  obarray is a  hash-table of atomic  symbols.  These  symbols are
said to be interned, or registered in the obarray.  Whenever a pname is read in
Lisp input, the obarray is searched  for a symbol with the same pname.	 If one
is found,  the pname  is considered  to refer to  that symbol.	 If not,  a new
symbol is created and added to the obarray.

   The	representation of  an obarray  is  a Lisp  array.  The	first  510. (or
thereabouts) elements of  the array contain lists  which are buckets of  a hash
table.	The last  128. elements of the	array contain the  "character objects,"
symbols  with	1-character  pnames.   (These	entries  contain  nil	if  the
corresponding  symbol has  not yet  been interned.)  The character  objects are
treated specially for  efficiency.  There are usually  one or two  unused array
elements between these two areas.

   In  order  to  allow  for  multiple	name  spaces,  Maclisp	allows multiple
obarrays.  An obarray  can be made "current"  by binding the symbol  obarray to
the appropriate array-pointer.	See page 2-91 for details on how  to manipulate
obarrays and arrays in general.

   It is possible  to have a  symbol interned on  several obarrays at  the same
time.  It is also possible to havE two different (non-eq) symbols with the same
pname interned	on different obarrays.	 Furthermore it is  possible to  have a
symbol which  is not  interned on any  obarray, which  is called  an uninterned
symbol.   These  are  useful  foR  purely-internal  functions,	but  can  cause
difficulty in debugging since they  can't be accessed directly.  Such  a symbol
can be accessed via some data structure that contains it, set up by the program
that created it.

   Normally symbols are  never removed from obarrays.	It is possible	for the
user to explicitly remove a symbol  from the current obarray.  There is  also a
feature by which  "truly worthless" symbols  may be removed  automatically (see
page 3-59).







Page 2-58			    ∪2-5.4			   March 3, 1979
				Atomic Symbols


intern		    SUBR 1 arg

     (intern x), where x is an atomic symbol, returns the unique  atomic symbol
     which is "interned  on the obarray"  and has the same  pname as x.   If no
     symbol on the current  obarray has the same  pname as x, then  intern will
     place x itself on the obarray, and return it as the value.


remob		    SUBR 1 arg

     The argument to remob  must be an atomic  symbol.	It is removed  from the
     current obarray if it is interned on that obarray.  This makes  the atomic
     symbol inaccessible to any S-expressions that may be read in or  loaded in
     the future.  remob returns nil.


copysymbol	    SUBR 2 args

     A subr of	two arguments.	The  first argument must  be a symbol,	and the
     second should be t or nil.   The result is a new, uninterned  symbol, with
     the same pname  as the argument.  "Uninterned"  means that the  symbol has
     not been  placed on any  obarray.	If  the second argument  is t,	the new
     symbol will be given the same  value as the original and will have  a copy
     of its property list.  Thus the new will start out with the same value and
     properties as the old,  but if it is  setq'ed or putprop'ed, the  value or
     property of the old will not  be changed.	If the second argument	is nil,
     the new symbol  has no value and  no properties (except  possibly internal
     system properties.)


gensym		    LSUBR 0 or 1 args

     gensym creates and returns a  new atomic symbol, which is not  interned on
     an obarray (and therefore is not recognized by read.) The	atomic symbol's
     pname is of the form prefix number, e.g. g0001.  The number is incremented
     each time.

     If gensym	is given an  argument, a  numeric argument is  used to	set the
     number.  The pname of an atomic-symbol argument is used to set the prefix.
     For example:




March 3, 1979			    ∪2-5.4			       Page 2-59
			   Maclisp Reference Manual



	  if   (gensym) => g0007
	  then (gensym 'foo) => f0008
	       (gensym 40) => f0032
	  and  (gensym) => f0033

     Note that the number is in decimal and always four digits, and  the prefix
     is always one character.




































Page 2-60			    ∪2-5.4			   March 3, 1979
				Atomic Symbols


5.5  Defining Atomic Symbols as Functions


   Atomic symbols may be used as names for functions.  This is done  by putting
the actual function (a subr-object or a lambda-expression) on the property list
of  the  atomic  symbol as  a  "functional  property," i.e.  under  one  of the
indicators expr, fexpr, macro, subr, lsubr, or fsubr.

   Array  properties  (see page  2-91)	are also  considered  to  be functional
properties, so an atomic symbol which is the name of an array is also  the name
of a function, the accessing function of that array.

   When  an atomic  symbol which  is the  name of  a function  is  applied, the
function which it names is substituted.


defun		    FSUBR

     defun is used for defining functions.  The general form is:

		(defun name  type (lambda-variable...)
		       body...)

     However, name and type may be interchanged.  type, which is  optional, may
     be expr, fexpr, or macro.	If it is omitted, expr is assumed.  Examples:

	  (defun addone (x) (1+ x))		;defines an expr

	  (defun quot fexpr (x) (car x))	;defines a fexpr

	  (defun fexpr quot (x) (car x))	;is the same

	  (defun zzz expr x			;this is how you
		     (foo (arg 1)(arg 2)))	; define a lexpr.

     The first example above is really just defining a synonym.  Another way to
     do this is:
			   (defprop addone 1+ expr)

     That is, an atomic functional property indicates synonyming.  This  can be
     particularly useful to define  a macro by an expr	or fexpr, or even  by a
     subr.


March 3, 1979			    ∪2-5.5			       Page 2-61
			   Maclisp Reference Manual


     The functions defprop and putprop may also be used for defining functions.

     There is a feature  by which, when a  file of functions has  been compiled
     and loaded into the lisp environment, the file may be edited and then only
     those  functions  which  were  changed  may  be  loaded  for  interpretive
     execution.   This is  done  by compiling  with  the "E"  switch,  and then
     reading in the  source file with the  variable defun bound  non-nil.  Each
     function will  have an expr-hash  property maintained, which  contains the
     sxhash of	the interpreted  definition od the  function.  defun  will only
     redefine  the function  if this  hash-code has  changed.  This  feature is
     rather dangerous since  reasonable alterations to the  function definition
     may not change the sxhash	and consequently may not take  effect.	Because
     of its general  losingness, this feature is  only available in  the pdp-10
     implementation and sometimes not even there.

	defun could have been defined by:

	(defun defun fexpr (x)	;circular, but you get the idea
	  (prog (name type body)

	    ; first, Analyze the form, get arguments.
	    (cond ((memq (car x) '(expr fexpr macro))
		   (setq type (car x)
			 name (cadr x)
			 body (cddr x)))
		  ((memq (cadr x) '(expr fexpr macro))
		   (setq name (car x)
			 type (cadr x)
			 body (cddr x)))
		  ((setq name (car x)
			 type 'expr
			 body (cdr x))))

	    (setq body (cons 'lambda body))










Page 2-62			    ∪2-5.5			   March 3, 1979
				Atomic Symbols



	    ; now, check for expr-hash hair.
	    (cond ((and defun
			(get name 'expr-hash)
			(= (get name 'expr-hash)
			   (sxhash body)))
		     )
		  ; actually make the definition.
		  ((putprop name body type)))
	    (return name)))


args		    LSUBR 1 or 2 args

     (args f) tells you the number of arguments expected by the function f.  If
     f wants n arguments, args	returns (nil . n).  If	f can take from m  to n
     arguments, args returns (m  . n).	If f is  an fsubr or a lexpr,  expr, or
     fexpr, the results are meaningless.

     (args f x), where x is (nil . n) or (m . n), sets the number  of arguments
     desired  by the  function	f.  This  only works  for  compiled, non-system
     functions.


sysp		    SUBR 1 arg

     The sysp predicate takes an  atomic symbol as an argument.  If  the atomic
     symbol is the name of a system function (and has not been redefined), sysp
     returns  the type	of function  (subr, lsubr,  or fsubr).	 Otherwise sysp
     returns nil.  Examples:

	    (sysp 'foo) => nil	(presumably)

	    (sysp 'car) => subr

	    (sysp 'cond) => fsubr








March 3, 1979			    ∪2-5.5			       Page 2-63
			   Maclisp Reference Manual














































Page 2-64			    ∪2-5.5			   March 3, 1979
				    Numbers




6.  Numbers


For a description  of the various  types of numbers  used in Maclisp,  see part
1.2.

6.1  Number Predicates


zerop		    SUBR 1 arg

     The zerop	predicate returns t  if its argument  is fixnum zero  or flonum
     zero.  (There  is no bignum  zero.)  Otherwise it	returns nil.  It  is an
     error if the argument is not  a number.  If that is possible  signp should
     be used.


plusp		    SUBR 1 arg

     The plusp	predicate returns t  if its argument  is strictly  greater than
     zero, nil if it  is zero or negative.  It	is an error if the  argument is
     not a number.


minusp		    SUBR 1 arg

     The minusp predicate returns t  if its argument is a negative  number, nil
     if it is a non-negative number.  It  is an error if the argument is  not a
     number.


oddp		    SUBR 1 arg

     The oddp predicate returns t  if its argument is an odd  number, otherwise
     nil.  The argument must be a fixnum or a bignum.







March 3, 1979			     ∪2-6.			       Page 2-65
			   Maclisp Reference Manual


signp		    FSUBR

     The signp predicate  is used to  test the sign of	a number.  (signp  c x)
     returns t	if x's sign  satisfies the test  c, nil if  it does not.   x is
     evaluated but c is not.  The result is always nil if x is not a number.  c
     can be one of the following:

		  l	  means    x<0
		  le	    "	   x<=0
		  e	    "	   x=0
		  n	    "	   x=/0
		  ge	    "	   x>=0
		  g	    "	   x>0

     Examples:
	 (signp le -1) => t
	 (signp n 0) => nil
	 (signp g '(foo . bar)) => nil


haulong		    SUBR 1 arg

     (haulong x)  returns the  number of  significant bits  in x.   x can  be a
     fixnum or a  bignum.  The result  is the least  integer not less  than the
     base-2 logarithm of |x|+1,

	Examples:
↓    (haulong 0) => 0
	    (hauLong 3) => 2
	    (haulong -7) => 3
↓    (haulong 12345671234567) => 40.









α



Page 2-66			    ∪2-6.1			   March 3, 1979
				    Numberq


6.2  Comparison


=		    SUBR 2 args

     (8
ApArRA%bAh@↓SLAp↓C]H@↓rACe∀A]k[∃eSGC1Yr@A∃ckCX8@ApA¬]H∪r↓[kgh%EJAE=iP~∀@@@A→Sq]k5fA←d↓E←iP↓IY←]U[f@9ααWO∃ε+GWπbβS :9voε≡,Rε⊗≤⎇g.o5aPPh!Q&?⊗\≡F/↔↓∀ααα	J5,∃$ε"ε␈$
V␈⊗T↔⊗?1Q hR∧∧ααε},V∂&↑.ααε=⎇Wε∂,↑2εON4αε∂,}Vn.nN2bα∞⎇εN≡∧
W/∨D∧ε⊗*
nVn⊗↑.2bαn&}h≥LV7α∞MphR∧∧ααπ-≤vG"d∧∧N∩∧⊗wJ≡&?.\Yg"ε≡4αεv}@ε?⊗\≡F/∩∞Mε∞r∧∞FF*
lWGαD∧ε/⊗\≡F/↔∧
&/'↑-g_h$∧ααα
m⊗br∧λ'/"
_bπ&Tε∂⊗}]V.wN4π&Z}&.∂L↑'αε≡,Rπ∨N-⊗∨&O∀ε&.>,V∂≡≥lrbπMRπ⊗↑>VgQ$ααα∧
↔
πEdα∧/≥Wεf↑7 hPQ!⊂JF},V∂&↑.αβ"ε5∩βkd∞@hP⊃∃ε?⊗\≡F/↔∧ε∩β
∀πSrεm≥@hP⊃∃ε?⊗\≡F/↔∧εBsαε5c2αV%∩βkd∞@hPα"*}Y8=↑\λ
∧εh ε$
(πWH≠Z-A"C"AQMB"∧∧λλ∀jXTHD<Y|aQA"H∧∧λλ
πd≡λ≡%∀~<h∞D~9H∂∧~<h∞>≤Z8nM≡(⊂∪\2pz2\⊂:40[⊂8V⊂_w2⊂7~v⊂7z~2y;t\pW⊂⊂≡⊂⊂0w→⊂<FEλ⊂⊂⊂⊂≠zyz_2P17]4⊂34↑5:vyH7y⊂!≠z4⊂#≠7w:v\UεEεBεA62\βsp	λ    LSQBR2 or more args

α     lEqsp Compares iTq argumentq  which  must be numbers, from left  to righ    If any argument is not less than the next, lessp returns nil.  But  if the
     arguments to lessp are strictly increasing, the result is t.  Examples:

		(lessp 3 4) => t
		(lessp 1 1) => nil
		(lessp -2 3.6 4) => t
		(lessp 0 2 1 3 4) => nil






March 3, 1979			    ∪2-6.2			       Page 2-67
			   Maclisp Reference Manual


<		    SUBR 2 args

     (< x y) is  t if x is  strictly less than y,  and nil otherwise.  x  and y
     must be both fixnums or both flonums.


max		    LSUBR 1 or more args

     max returns the largest of  its arguments, which must be numbers.	 If any
     argument is a flonum, the result will be a flonum.  Otherwise, it	will be
     a fixnum or a bignum depending on its magnitude.


min		    LSUBR 1 or more args

     min returns the smallest of its arguments, which must be numbers.	 If any
     argument is a flonum, the result will be a flonum.  Otherwise, it	will be
     a fixnum or a bignum depending on its magnitude.


























Page 2-68			    ∪2-6.2			   March 3, 1979
				    Numbers


6.3  Conversion


fix		    SUBR 1 arg

     (fix x) converts  x to a  fixnum or a  bignum depending on  its magnitqde.
     Examples:

	  (fix 7.3) => 7
	  (fix -1.2) => -2
	  (fix 104) => 104


ifix		    SUBR 1 arg

     (ifix x) converts x from a  flonum to a fixnum.  ifix will never  return a
     bignum, unlike fix.  This allows it to be efficiently open-coded.	This is
     not the  same function as	IFIX in Fortran;  rounding is down  rather Than
     towards zero.  It is like ENTIER in Algol.

     ifix does not exist in the Multics implementation.


float		    SUBR 1arg

     (float X) coNverts x to a flonum∞	Example:

	  (float 4) => 4.0
	  (float 3.27) => 3.27


abs	↓    SUBR 1 Arg

     (abs x) => |x|, the absolute  value of the number x.  abs could  have been
     defined by:

	(defun abs (x) (cond ((minusp x) (minus x))
			     (t x) ))



¬


March 3, 1979			    ∪2-6.3			       Page 2-69
λ	↓	   Eaclisp RefeRence Mafualλ
(hP4Y⊂N↑b"(∧∧λ∀u(*Hλ ≡Yc"AP¬⊂⊂⊂λ⊂6tg≥yP⊂)→z:y7≤P:42H⊂72`'ativE kf  its argument$ whicH can	be any	`↔Sαs⊃β?0h)↓↓α↓β;Wn∪↔I9αα↔cπoβ3↔MPh(4(HI#π≥nW
β∃∀βkr¬V⊂hPα"*
]8π:yH⊗YW≠
P≡←⊂W≠εEβAαE$_tx0y≥∧DP⊂λ⊂)ba∀⊂→⊂ \3yFEβE⊂⊂⊂λ⊂⊂40Zx0p∩t  x n)  extracTpε@A\↓YKCI%]N@A=`	↓β'∪ππ3Ls≥βM#@~αj&}j∧
FF*
⊂NL<[X-A Hλ∧∧λ≤Y.∞Y<q-n_9~-⎇H≠qD∂	Hλ∂∧≠8>$Y(_$Z>≠N](≠tD(_Z,]]; ↔λ⊂7⊂6]yz⊂1→P⊂0@→4|7:[U
     The valqe	Iq retqr`≥K⊂ACf∪∧AMCq9kZA←H@ABA	SO]k4\∪∪LATASβ→↓βC␈≠'S'6)1βSF(4)↓α↓↓βK/≠W3Qαβ∂?;&';MαβS#∃εq↓β#L;!7∨⊗#↔I↓π≠'∨;L3'∂πw!↓βM#@~ε|a↔gGE`λ∧∧∩9H∧
H~4aQHλλ∧∧≠Y9l≡~=Y%D≥~→$∞Y<⎇-Nλλ_m⎇]_:-nh≥~T∨≠←∧
≠⎇c-}Y→<D∧_Z=∞∀≠yH∂O≥@∧	9Hλ∂M←λ∩.1"Hλ∧∧λ_Z,|y<H∞M_;H∞M→(≠N]8Y<D
yH≤m≤{Z1M≤x;]∧X9≤d
;H≡¬D∨≡∨∧
<h∀L↑≥<[L\C"AQB16≥<≠→.↔C"B$∧λλ

:8λ0\:⊂→Z
[≠P≠JP≡←⊂Y→εEβEP⊂λ⊂∀40Zx0q:λ→Z~[
P∩ZTH≡←⊂→
FEεEαP⊂⊂⊂
40tx_y:⊂⊗LZ~[≠H⊗ZTP∂←⊂→≠CEαEεBεEεEβEαEεBεEεEβEεEεBεEεEβEεEεBεEεEβE(0sYP→⊗[L∧DDPλ⊂⊂	Y[↔→DBDP⊂⊂∪py1tλ→R_N[\FEβ∧DDDH⊂⊂⊂'≥vq2y≤β


α6.∀  ArithmeTic

λ	
			      General Aradhmadic
~∀@A)Q∃g@∃β5+;∂SN{;Mβ>K3 "∞Wε6}-Rε∂-≡FFn↑M⊗~α
ybε∞o∀ε↑∞l@ε}2
nVn⊗↑.2bα≥f"ε≥Nv∂O1Q'NN]LBε∞dWF∞>A↔⊗/>]G"b←ε≡/∞Dπ>F]dπ/≡\@απ>≡Mαε6M⎇g.o5dααDmIvw.↑4αεF≡hRεf≥]↔&.AQ'π⊗\=↔<9{H≥Yλ∀L≥Yy+E∀⊂{sNl<\p∀[w9P⊂≥4π fLonum↓←dA¬%K]kZ↓aKae∃cC]i¬iS←\ACeJ↓I←]J4∃CfA9KKIK⊂\@@A→Y←]k4AeKaIKgK]QCiS←8@AoS1XAEJ↓kgKHASLA¬]r@A=HAiQ∀@ACe≥k[K]QfACe∀~∃MY=]k[flA←iQ∃eoSg∀AMSq9kZAe∃aeKg∃]iCi%←\Ao%YXAE∀AkgK⊂ASLAQQJAe∃gkYh↓GC\@↓MShA%\~∃M%q]kZ↓M←eZ0A←dA	SO]k4AeKaIKgK]QCiS←8ASLA%hAGC9]←h\4∀~∀@A)QJ↓io↑AMKGiS=]f@A¬MiKd↓iQSf↓←]J@↓IKgGISEJA=iQKd↓CeSi![KiS∪Mk]
iS←]LAoQS
P~∃CIJA[←IJAKM→SGSK9hAEkPAYKgLAa←o∃eMkX8~∀~∃AYkf∩$@@@A1'+¬$`A←d↓[←eJ↓CeOf4∀~∀@@@Aa1kfAe∃ike]LAiQJ↓gkZA=LASiLACeOU[K]iLXAoQ%GPA[¬rAEJ↓C]rA-S]HA=LA]k5EKef8~∀~∀4∃ISM→KeK]
J∩@@A→'+	$@bA=dA[←IJACe≥f~∀~(@@@@↓ISMM∃eK]G∀AeKiUe]fA%ifAM%eghA¬eOk[∃]hA[%]kfAQQJAe∃ghA←_ASif↓CeOk5K]if8@A∪h4∀@@@Ao←e-fAM←HAC]r↓WS]H↓←LA]U[EKeL\~∀~(~∃iS5Kf∩∩@@A→M+¬$@@A←dA5←eJA¬eOf~(~∀@@@AiS5KfAe∃ike]L@AiQ∀Aae←⊃kGh@↓←LASQfACe≥k[K]Qf\@@↓∪hAo=eWf@↓M←dA¬]r∪W%]HA←_~∀@@@A]k5EKef8~∀~∀4∃ck←QSK]h$@@@A1'+¬$bA←d↓[←eJ↓CeOf4∀~∀@@@AcU←iSK9hAeKQke]f↓SifA→Segh↓CeOk5K]hA⊃SmSI∃HAEr↓iQJAIKghA=L@ASQfACe≥k[K]Qf\~∀@@@AQQJACIOk[K9ifA[¬rAC]dAWS]⊂A←LA9k[EKH\~∀~(∪qC5aYKfh~∀∩@Qck←QSK]hf@dR@z|@D∩@@@wMSq9kZAI%mSgS=\AieU]GCi∃f\~∀4∀∩@@!ck←i%K]h@L@d\`$@z|@b\j@wEkh↓MY←]UZAISYSgS←8AI←KLA]←h8~∀~∀$@@QcU←iSK9h@l\@@b\j@d\`$@z|@H\`~∀4∃≠Ce
P@fXbrnr$∩∩@@@&dZX\h∩∩$@@@@@A!C≥J@dZ\b~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃CI⊂b∩∩@@A'+	$@bA¬eN~∀4∀@@@@QCI⊂bApRz|Ap,b\@A`A[Cr↓EJAC9rAWS9HA←L↓]k[E∃d\~∀4∀~∃gUDb∩∩@@A'U¬$@b↓CeN~(~∀@@@@QgUDbAp$@z|A`Zb\@↓pA[CdAEJA¬]rAW%]HA←_A]k[	Kd\~(~∀~∃IK[CS9IKd∩@@A'U¬$@d y) => the remainder of  the division of x by y.  The	sign of
     the remainder is the same as the sign of the dividend.  The arguments must
     be fixnums or bignums.


gcd		    SUBR 2 args

     (gcd x y) => the greatest	common divisor of x and y.  The  arguments must
     be fixnums or bignums.


expt		    SUBR 2 args

		   z
     (expt x z) = x

     The exponent z may be a bignum if	the base x is 0, 1, or -1;  otherwise z
     should be a fixnum.  x may be any kind of number.

     As a special feature, expt allows	its second argument to be a  flonum, in
     which  case  the  first  argument	is  converted  to  a  flonum   and  the
     exponentiation  is performed  in  floating point,	using  logarithms.  The
     result is a flonum in this case.


*dif		    SUBR 2 args

     *dif is  a subr form  of difference.  It  is documented here  because some
     people  use  it.	There  is  no reason  to  use  it,  since  the compiler
     automatically converts difference into *dif as required.


Page 2-72			    ∪2-6.4			   March 3, 1979
			λ    NumbeRq


α*auo	↓   SEBR 2 @¬eOf~(∩∧@@@@ECU↑@ARβ→β¬↓¬≠WI∧∧f␈⊗β(λ
|H≤=-}~93NEHλλ	≡λ~ →H⊂27a]vrw:→p⊂42\2P⊂!→qpp∃MJAg←αk∀4	α↓↓↓βα+?C3*↓βGN*↓β'QpJS#↔⊗)↓β'α4αε@Yh⊂→→pyw`.  to  qsE  it,  since  the c@←αkC'3-⊂$	↓α↓↓βεαP≥
⎇89~,<9≠⊗${{]L↑]_	P≤zsz4Yw:⊂)npo *qug ¬`
βK-G'K,!0$λhP4Pβ"C!"C"AP¬

λ↓α

∀4Ph (!Q h↓@εEεB¬


∀4Ph (!Q h⊂β"C!αAεEβA

λ
∧~(~(Q!PDn≤,6Bβ5Dβ↓-n"!⊂(λλ∧αlC ≠~∧DDH⊂⊂⊂⊂λ⊂( sYP→ε@6∧f~∀⊂∩α∩@A7∞≠3'OααK↔≠(ε&.v<T∧n∞n\⊗`@ ¬εEβA			       Fi@a]cZA¬aSiQ5KiSF4⊂∀(hQ↓↓α&C↔O∃αβ∪@.βPe
≥{\h∞,<90∀\2P⊂ 4he`∪dα↓βπK?+7.β]≤d∞≠hλ,(→@∀↑0εums  and  prodqce onl`24⊃MSQ9kZβ⊗+GW3'→1↓αL1↓βSF)βCK,∧@O⊗↑8
-Nα⊂  whicH wou1H@AE∀AeKiU`;⊗ ∧αε↔∀∧π&FT	V␈⊗QQ&.9Q0→_v⊂3 5ncti@=]f@A⊃KgGe%EKHAAaKmSα{WO3Jaβ'MαβS>tλ≡Yy(∞MβP⊂1→P92x≤2yrg≥2r⊂⊂_yP0FB34p_num, The requlTACGiUCYYr↓eKiKβ∪;↔⊃π;'31αβ∃β'∪W;∂∂#↔⊃β&y↓βπpβ'7Cd∧Vn∞β]_.M;{C!QY→<]Y→3ND≠];,,<H⊂↔Yα bitpεXAo!SGPA%`
↓M2q↓#'v≠3@.M→f:πMRπ≡≤⎇bJε≥dπεFT∧∧o.NM⊗∨~≥f h,Gαk⊗∧εNo
HVn∞β]_.M;{\edλ∃~T_{s.
;→<D∞≤[y∞\y<h

9z≠∂∀9|≥
≥:>Q,D_{qTλ→[n$≥~→.<#"Sn<X=
≥{\kAQA"Ja⊃(λλ∧	∀u0J$λ≠n∧≠;|LT_8Yn1"C"D∧λλλ¬4≤Y=∞↑Y\h∞M→(λ∞>;(≠ld~=≤d<Y⎇-\9]≤edλλ∃
(_<L};9;NNh≠=.>λ_Y$∧→Z>
n;<k∧;Yβ!$λλλ∧∞~→(∞,<⎇;∞D~<h≥≥x>.4_(→M∨≠];%dλ⊃>≥<≠→.7C"C!!"*
dεH
H¬V*(∂'d
c"A⊃*
hε5(∂/Dεb.⎇∞-=Z8-D_x<lQ"B"%¬j(∂'dα.m≤→;]
≡≡(→-L;9;NA"C"AQK""$∧λλ∪
:0THε∧≠|H
]|Y(≡Y|c!!"Hλ∧∧λ∃~
≡hλ~.4λ≥~T→Z>
n;+;mm≡"<n\]≤X,>~;{D∧→];L>~;{Ea5z=
∧λ≠{LTλ_<L};9;NEλ~=↓QHλλ∧∧≤Y=∞↑[\h∞M→(≠N]8Y<D}hλ≠L\x=~-⎇KHλ
⎇=~λ
]|Y(∧∞~_;D
{Y(≡Y⎇;,]]λ∧
=λ≤L↑≥<[N1"Hλ∧∧λ≥~T→Z<N>λ_<L};9;ND≠:;N↑h≥~T≤Y<nD≠yH∞M→(_.,⎇;9-n≤kC!!"B"%¬*(∂'dλ∞M→(~,L;]~.O(→;]9;]↓QB"*¬Tj(πWH,aQB"*¬T
(e∀∂/Hε!"B"%¬(Hεd,*$π/H&1"B9.LkC"AQC"JA⊃(λλ∧	∀u0J$λ≠n$≠;|LT_<Yn1"C"D∧λλλ¬$≤Y=∞↑[\h∞M→(≤∞-y≥8nD≠yH
≡≤h_.,⎇;9-n≤kH∧λ>_;.
→<nAQC"B!∃
H
∧ε(-E∀∂/H¬V,LAQB"*¬$j(πWHb$∧λλλπ>≤Z=M≤;λ_l≡y#"A⊃*
J$π/H!∀λλλ∧πz9→-n~=≡$;→;,]]β"AQC"C!*_9y$εK-m↓⊃"(λ∧∧∧lK&eMα"!∀λλ∪,≡Xzλε5λ.&w#"@↓A"""$∧λλ∪N]8Y<N1"C"AQKb"$∧λλ∪
:0THε∧≠|H
]|Y(≡Y|c!!"Hλ∧∧λ∃~
≡h~<d∞~→(m>≠]-U;{[∂∀→~=M≡z;{D];XnM;{KD∧∃~→$<Y⎇-\;]≤d
=<⎇∧∧_Y(m>≠]-↑c"H∧∧λλ_-lλ≥~T≤Y<n]≥λ≠ld≥~→$~=Z.=;{H
≡h≥≤N]Xx=\λ≥≠d;H~-n→9y.$_;Y∧∧≤Y=∞↑YY9∧<c"D∧λλλ∀→Z>
n;+B)m⎇→(∧∞~_=∧∞~→(
l;9(∧
yH≥

<h→N]X⎇~-⎇H≠=.>λλ_LT≥≡<\λ~3D∧_<h¬ukβ"D∧λλλ∞=9Xq$	~<|∧∞<y<d¬h_<d;H→.≤x<⊃$z_<L≤⎇→<EA C"D∧λλλ	≤H≥<l\λ≥z.Mλ≠;n,(≥~≥H≠sLT_8Yn]9;]¬D~=λM=Z1↑h≥~T→Z<N>λ_<L};90↔≥⊂⊂1<H:42FB⊂⊂⊂⊂λ92yzλ5s⊂⊂≥42P0\3zvr[:9W⊂λ$s⊂⊂≥yrb≥tz4≠w6<Pλ7w2P_y3zfYw:⊗⊂~z⊂⊂)→z:y7≤P:42CA⊂⊂⊂λ⊂34l≠:vP⊂≤2qtx≤5qpvλ⊂7s⊂λ:40zλ⊂7:vX2y⊗⊂≥t4qtλ⊂4yPλ⊗XV⊂λ_⊂ 1 _@A=`	βWv#↔πv+⊂4$∧αααLWε.lM⊗v:
ybπ≡X

<H⊂~~2P7:[q2y is -⊃, larg`
X@DXA←∧`\
∀4∀∩@@@@@@ ↑↑@%βiy↓EbβS#∃εK∪↔;&KSeβ,c↔7↔w!0$λJ↓↓↓↓α↓↓!≤z↓IAdεRJβWdβ h!∀ααα∧∧ααBβkhε⊗Hε4J(πWH%Ea"B(∧∧λλλ∧=_kAQ@εEεB_UDDλ⊂⊂⊂)Ua)⊂_H0y3FBεA⊂⊂λ⊂⊂∀_JP<∀P∂←⊂<∃LU⊂⊂,λ6zyzλ12P0H34|7≥vW⊂⊂∃42P9→yzv*λ4yP0[9ptiH0P3$↑7:vWβEαEεB_VDDH⊂⊂⊂)Ua)⊂_H0y3FBεE⊂⊂λ⊂⊂∀_KP<∀P∂←⊂<⊗LW⊂⊂<λ6zyzλ12P0H34|7≥vW⊂⊂∃42P9→yzv*λ4yP0[;p|yH0P3$↑5:vGβEαEεB,∧DPλ⊂⊂)jP)⊂→_y3yFBεE⊂⊂λ⊂⊂∀.λ<⊂<TH92z:\71P:~2P⊂9→vptw→2y⊂'Y⊂<⊂2~{4r2Y⊂1<Pλ<V⊂+Zz4⊂:~2P9tYw⊂7cλ⊂<↔⊂λ<εE⊂λ⊂⊂⊂0[2⊂<P≠zyz⊂_2P34↑5:vyK⊂⊂"|_vx6"\]εEεB∧P⊂⊂λ⊂⊂⊂∀↔⊂~P→
P≡←⊂FE∧Pλ⊂⊂⊂⊂λ∀.⊂≠
W⊂⊗\K∀P≡Oλ→εE∧H⊂⊂⊂⊂λ⊂∀.⊂[~W⊂∞W∀P≡O⊂⊗YεBεEεE↔,∧DPλ⊂⊂)jP)⊂→_y3yFBεE⊂⊂λ⊂⊂*4~yP9zX9⊂7cλ⊂:;wH0y3z[rs:9H4yP6~urP⊂→qr⊗⊂_:z⊂7[6<P0Xqrx:≤P⊂34↑7:vyK⊂⊂*4~yFE⊂λ⊂⊂⊂6XuryP~z⊂30\z2y⊂≥40w⊂→qr↔εBεEεE∪py1tλ→V⊂_N[\DDBP⊂⊂⊂∧Y⊗[↔
∧DDPλ⊂⊂⊂⊂λ(0srH→⊗[ZCEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβE/∧DH⊂⊂⊂)Ua)⊂→λ0y3yCEεE⊂λ⊂⊂⊂/λ4yP:~2P34↑7:vP≠w6<P→|87w→w:4p]4ww⊂→:w1z~ww↔⊂λ$z⊂4\P9wvY{t0zλ⊂30y]2y⊂:~0wεEλ⊂⊂⊂⊂→|8:⊗λs returfs  a fixjum result, which  will be incorrect if  the true
     result is too large to be represented as a fixnum.






































Page 2-76			    ∪2-6.4			   March 3, 1979
				    Numbers


			       Flonum Arithmetic


   These functions requiRe  their arguments to	be flonums$ and  always produce
fhonum results.  If the true result is too large op too small to be represented
as a  flOnum, an arithmetic  underdlow or overflow  error will occur.	(In the
pdp-10 implementation these errors are not detected in compiled  programs.) The
compiler produces highly-optimized code for these operations.

+$		    LSUBR 0 or more args

     +$ returns the sum of its arguments.

	Examples:
		(+$ 4.1 3.14) => 7.24
		(+$  2.0 1.5  -3.6)  => -0.1
		(+$ 2.6) => 2.6		;trivial case
		(+$)  => 0.0		;identity element


-$		    LSUBR 0 or more args

     This is  the flonum-only  subtraction function.  When  used with  only one
     argument, it  returns the	number's negation.   Otherwise, it  returns the
     first argument minus the rest of the arguments.

	       (-$) => 0.0, the identity element
	       (-$ x)  => the negation of x.
	       (-$ 6.0 2.5) => 4.5
	       (-$ 2.0 1.5 -3.6) => 3.1
	       etc.


*$		    LSUBR 0 or more args

     *$ returns the product of its arguments.  Examples:

	     (*$ 3.0 2.0 4.0) => 24.0
	     (*$ 6.1) => 6.1		;trivial case
	     (*$) => 1.0		;identity element




March 3, 1979			    ∪2-6.4			       Page 2-77
			   Maclisp Reference Manual


/$		    LSUBR 0 or more args

     This is the  flonum-only division function.   Note  that the name	of this
     function  must  be  typed in  as  //$,  since Lisp  uses  /  as  an escape
     character.   This	function  computes the	reciprocal  if	given  only one
     argument.	If given  more than one argument,  it divides the first  by the
     rest.

	       (//$) => 1.0, the identity element
	       (//$ 5.0) => 0.2
	       (//$ 6.28 3.14) => 2.0
	       (//$ 100.0 3.0 2.0) => 16.5
	       etc.


1+$		    SUBR 1 arg

     (1+$ x) => x+1.0.	x must be a flonum.  The result is always a flonum.


1-$		    SUBR 1 arg

     (1-$ x) => x-1.0.	x must be a flonum.  The result is always a flonum.


↑$		    SUBR 2 args

     ↑$ is the flonum-only exponentiation function.  The first argument must be
     a flonum, the second must be  a fixnum (repeat, a fixnum), and  the result
     is a flonum.  To raise a flonum to a flonum power, use (expt x y)	or (exp
     (*$ y (log x))).













Page 2-78			    ∪2-6.4			   March 3, 1979
				    Numbers


6.5  Exponentiation and Logarithm Functions


sqrt		    SUBR 1 arg

     (sqrt x) => a  flonum which is the square	root of the number x.	This is
     more accurate  than (expt	x 0.5).  The  following code,  which is  due to
     Gosper, should be written if the  square root of a bignum is  desired.  It
     is  essentially  a  Newton  iteration,  with  appropriate	precautions for
     integer truncation.

	  (defun bsqrt (n)
	     (bsqrt1 (abs n)
		     (expt 2 (// (1+ (haulong n)) 2))))

	  (defun bsqrt1 (n guess)
		 ((lambda (next)
		    (cond ((lessp next guess)
			   (bsqrt1 n next))
			  (t guess)))
		  (quotient (plus guess (quotient n guess))
			    2)))


exp		    SUBR 1 arg

		 x
     (eXp x) => e


log		    SUBR 1 arg

     (log x) => the natural logarithm of x,











March 3, 1979			    ∪2-6.5			       Page 2-79
			   Maclisp Reference Manual


6.6  Trigonometric Functions


sin		    SUBR 1 arg

     (sin x) gives the trigonometric sine of  x.  x is in radians.  x may  be a
     fixnum or a flOnum.


cos		    SUBR 1 arg

     (cos x) returns the cosine of x.  x iq in radians.  x may be a fixnum or a
     flonum.


atan		    SUBR 2 args

     (atan x  y) returns the  arctangent of x/y,  in padians.  x  and y  may be
     fixnums or flonums.  y may be 0 as long as x is not also 0.

























Page 2-80			    ∪2-6.6			   March 3, 1979
				    Numbers


6.7  Random Functions


random		    LSUBR 0 to 2 args

     (random) returns a random fixnum.
¬
     (rafdom nil) restarts the random sequencE at its beginning.

     (random x), where x is a fixnum, returns a random fixnum between 0 and x-1
     inclusive.  A useful function is:

	(defun frandom ()
	    (//$ (float (random 10000.)) 10000.0)))

     which returns a random flonum between 0.0 and 1.0.

     (random n1 n2) setq the random  number seeD from the pair of  integers n1,
     n2.


zunderflow	    SWITCH

     If an iNtermediate or  final flonum result in the	interpretive arathmetic
     functions	(timas,  *$,  expt,  etc.) iq  too  small  in  magnitu`e  tk be
     represeNted by the machine,  corrective action will be taken  according to
     the zenderflow switch∞

     If the value of zunderflow is non-nil, the offending result will be set to
     0.0 and computation will proceed.	 If the value of zunderflow is	nil, an
     error will be signalled.  nil is the initial value.

     In the pdp-10 implementation  compiled code is not affected  by zunderflow
     if the arithmetic	in question was  open-coded by the  compiler.  Instead,
     computation proceeds using a result with a binary exponent 256 higher than
     the correct exponent.  In the Multics implementation zunderflow  works the
     same for compiled code as for interpreted code.

     See (sstatus divov), which controls division by zero (part 3.7).





March 3, 1979			    ∪2-6.7			       Page 2-81
			   Maclisp Reference Manual


6.8  Logical Operations on Numbers


   These  functions  may be  used  freely for  bit  manipulation;  the compiler
recognizes them and produces efficient code.

boole		    LSUBR 3 or more args

     (boole k x y) computes a bit by bit Boolean function of the fixnums  x and
     y under the control  of k.  k must be  a fixnum between 0 and  17 (octal).
     If the binary representation  of k is abcd,  then the truth table	for the
     Boolean operation is:

	      y
	←←←|←0←←1←
	  0| a	c
	x  |
	  1| b	d

     If boole has more than three arguments, it goes from left to right; thus

		  (boole k x y z) = (boole k (boole k x y) z)

     The most common values  for k are 1 (and),  7 (or), 6 (xor).  You	can get
     the complement, or logical negation, of x by (boole 6 x -1).

	   The following macros are often convenient:

	(defun logand macro (x)
	  (subst (cdr x) 'f '(boole 1 . f)))

	(defun logor macro (x)
	  (subst (cdr x) 'f '(boole 7 . f)))

	(defun logxor macro (x)
	  (subst (cdr x) 'f '(boole 6 . f)))








Page 2-82			    ∪2-6.8			   March 3, 1979
				    Numbers


     Alternatively, these could be defined with macrodef (see part 6.2):

	(macrodef logand x (boole 1 . x))

	(macrodef logor x (boole 7 . x))

	(macrodef logxor x (boole 6 . x))


lsh		    SUBR 2 args

     (lsh x y), where x and y  are fixnums, returns x shifted left y bits  if y
     is positive, or x shifted right |y| bits if y is negative.  Zero-bits are
     shifted in to fill unused positions.  The result is undefined if |y| > 36.
     The number 36 is implementation dependent, but this is the number	used in
     both the Multics and pdp-10 implementations.  Examples:

		(lsh 4 1) => 10 (octal)
		(lsh 14 -2) => 3
		(lsh -1 1) => -2


rot		    SUBR 2 args

     (rot x y) returns as a fixnum the 36-bit representation of x, rotated left
     y bits if y  is positive, or rotated right  |y| bits if y is  negative.  x
     and y must be  fixnums.  The results are undefined  if |y| > 36.	As with
     lsh, the number 36 depends on the implementation.	Examples:

	    (rot 1 2) => 4
	    (rot -1 7) => -1
	    (rot 601234 36.) => 601234
	    (rot 1 -2) => 200000000000
	    (rot -6 6) => -501


The following feature only exists in the pdp-10 implementation.

     The  internal  representation  of	flonums  may  be  hacked   using  these
     functions.   lsh or  rot  applied to  a  flonum operates  on  the internal
     representation of the  flonum and returns	a fixnum result.   For example,
     (lsh 0.5 0) => 200400000000 (octal).  The following function also exists:


March 3, 1979			    ∪2-6.8			       Page 2-83
			   Maclisp Reference Manual


fsc		    SUBR 2 args

     (fsc x  y) performs  a FSC  instruction on the  two numbers  x and  y, and
     returns the result  as a flonum.  Consult	the pdp-10 processor  manual if
     you want to use this.

     x	and  y	may  be   fixnums  or  flonums;  fsc  just  uses   the	machine
     representations of the  numbers.  If y is	greater than 777777  octal, the
     FSC instruction is omitted  and the possibly-unnormalized flonum with the
     same machine representation as x is returned.


































Page 2-84			    ∪2-6.8			   March 3, 1979
			    Character Manipulation




7.  Character Manipulation


7.1  Character Objects


   An atomic  symbol with  a one-character  pname is  often called  a character
object	and used  to represent	the  ascii character  which is	its  pname.  In
addition the atomic symbol with  a zero-length pname represents the  ascii null
character.  Functions which take a character object as an argument usually also
accept a string one  character long or a  fixnum equal to the  ascii-code value
for the character.  Character objects  are always interned on the  obarray (see
page 2-58), so they may be compared with the function eq.


ascii		    SUBR 1 arg

     (ascii x), where x is a number, returns the character object for the ascii
     code x.

     Examples:

     (ascii 101) => A

     (ascii 56) => /.


getchar		    SUBR 2 args

     (getchar x n), where x is an atomic symbol and n is a fixnum,  returns the
     n'th character of	x's pname; n =	1 selects the leftmost	character.  The
     character is returned as a character object.  nil is returned if n is out
     of bounds.









March 3, 1979			     ∪2-7.			       Page 2-85
			   Maclisp Reference Manual


getcharn	    SUBR 2 args

     getcharn is the same as getchar except that the character is returned as a
     fixnum instead of a character object.


maknam		    SUBR 1 arg

     maknam  takes  as	its  argument  a  list	of  characters	and  returns an
     uninterned  atomic symbol	whose  pname is  constructed from  the	list of
     characters.  The  characters may be  represented either as  fixnums (ascii
     codes) or as character objects.  Example:

			 (maknam '(a B 60 d)) => ab0d


implode		    SUBR 1 arg

     implode is the same as  maknam except that the resulting atomic  symbol is
     interned.	It is more  efficient than doing (intern (maknam  x)), although
     it is less efficient than plain maknam which should be used when interning
     is not required.


readlist	    SUBR 1 arg

     The argument to readlist is  a list of characters.  The characters  may be
     represented either as fixnums (ascii codes) or as character  objects.  The
     characters in the list are  assembled into an S-expression as if  they had
     been typed  into read (see  part 5.1.) If	macro characters are  used, any
     usage in the macro character function of read, readch, tyi, or tyipeek not
     explicitly specifying an input file takes input from  readlists's argument
     rather than from an I/O device or a file.	This causes macro characters to
     work as you would expect.

	Examples:
	    (readlist '(a b c)) => abc
	    (readlist '( /( p r 151 n t /  /' f o o /) ))
		=> (print (quote foo))	;ascii 151 = "i"

     Note the use of the slashified special characters left parenthesis, space,
     quote, right parenthesis in the argument to readlist.


Page 2-86			    ∪2-7.1			   March 3, 1979
			    Character Manipulation


explode		    SUBR 1 arg

     (explode x) returns  a list of characters,  which are the	characters that
     would be typed out if  (prin1 x) were done, including slashes  for special
     characters but not including extra newlines inserted to prevent characters
     from running  off the right  margin.  Each character  is represented  by a
     character object.	Example:

	(explode '(+ /12 3)) => ( /( + /  // /1  /2 /  /3 /) )
		;Note the presence of slashified spaces in this list.


explodec	    SUBR 1 arg

     (explodec x) returns  a list of characters  which are the	characters that
     would be typed  out if (princ x)  were done, not including  extra newlines
     inserted to prevent characters from running off the right margin.	Special
     characters  are  not  slashified.	 Each  character  is  represented  by a
     character object.	Example:

	(explodec '(+ /12 3)) => ( /( + /  /1 /2 /  /3 /) )


exploden	    SUBR 1 arg

     (exploden x) returns  a list of characters  which are the	characters that
     would be typed  out if (princ x)  were done, not including  extra newlines
     inserted to prevent characters from running off the right margin.	Special
     characters are not slashified.  Each character is represented by  a number
     which is the ascii code for that character.  cf. explodec.  Example:

	(exploden '(+ /12 3)) => (50 53 40 61 62 40 63 51)


flatsize	    SUBR 1 arg

     (flatsize x) returns the number  of characters prin1 would use to	print x
     out.






March 3, 1979			    ∪2-7.1			       Page 2-87
			   Maclisp Reference Manual


flatc		    SUBR 1 arg

     (flatc x) returns the number of characters princ would use to print x out,
     without slashifying special characters.








































Page 2-88			    ∪2-7.1			   March 3, 1979
			    Character Manipulation


7.2  Character Strings


   These  character  string functions  only  exist at  present	in  the Multics
implementation	of Maclisp.   A predicate  to test  if your  implementation has
these functions is
			   (status feature strings)

   These functions all accept atomic symbols in place of strings  as arguments;
in this case the  pname of the atomic symbol  is used as the string.   When the
value of one of these functions is described as a string, it is always a string
and never an atomic symbol.  Also see the functions on page 2-56.


catenate	    LSUBR 0 or more args

     The arguments are character strings.  The result is a string which  is all
     the arguments concatenated together.  Example:

	  (catenate "foo" "-" "bar") => "foo-bar"


index		    SUBR 2 args

     index  is	like  the  PL/I  builtin  function  index.   The  arguments are
     character strings.   The position	of the first  occurrence of  the second
     argument in the first is returned, or 0 if there is none.	Examples:

	  (index "foobar" "ba") => 4
	  (index "foobar" "baz") => 0
	  (index "goobababa" "bab") => 4


stringlength	    SUBR 1 arg

     The argument to  stringlength must be a  character string.  The  number of
     characters in it is returned.  Examples:

	  (stringlength "foo") => 3
	  (stringlength "") => 0




March 3, 1979			    ∪2-7.2			       Page 2-89
			   Maclisp Reference Manual


substr		    LSUBR 2 or 3 args

     This is like the PL/I substr  builtin.  (substr x m n) returns a  string n
     characters long,  which is a  portion of the  string x beginning  with its
     m'th character and proceeding for n characters.  m and n must  be fixnums,
     x must be a string.

     (substr x m) returns the portion  of the string x beginning with  its m'th
     character and continuing until the end of the string.  Examples:

	  (substr "foobar" 3 2) => "ob"
	  (substr "resultmunger" 6) => "tmunger"


get←pname	    SUBR 1 arg

     (get←pname x) returns the pname of x as a character string.  x must  be an
     atomic symbol.


make←atom	    SUBR 1 arg

     make←atom returns	an atomic symbol  whose pname is  given as  a character
     string  argument.	 Contrary to  previous	editions of  this  manual, this
     atomic symbol is interned.  Example:

	  (make←atom "foo") => foo

















Page 2-90			    ∪2-7.2			   March 3, 1979
				    Arrays




8.  Arrays


   As explained in  part 1.2, an  array is a group  of cells which  may contain
Lisp objects.  The individual cells are selected by numerical subscripts.

   An array is designated by  a special atomic object called  an array-pointer.
Array-pointers	can  be  returned by  the  array-creation  functions  array and
*array.  An array-pointer  may either be used  directly to refer to  the array,
or, for convenience  in referring to the  array through input/output  media, it
may be	placed on the  property list  of an atomic  symbol under  the indicator
array, and then that symbol can be used as the name of the array.

   There are  several types  of arrays.   The main  types are  ordinary arrays,
whose cells can  hold any type	of object, and	number arrays, whose  cells can
only hold numbers.  Number arrays permit more efficient code to be compiled for
numerical  applications,  and take  less  space than  an  ordinary  array which
contains the same number of numbers.  See the array* declaration (part 4.2) and
the arraycall function (page 2-14).

   When an array is created its type must be declared by giving a  "type code."
The type code for  ordinary arrays is t.  For  number arrays, the type	code is
either fixnum or flonum.  A particular	number array can only hold one	type of
numbers because its cells contain the machine representation of the number, not
the Lisp-object representation.

   Some other types of	arrays are:  un-garbage-collected arrays, with	a type-
code of nil,  which are the  same as ordinary arrays  except that they	are not
protected  by the  garbage  collector and  therefore  can be  used  for certain
esoteric  hacks; obarrays,  with  a type-code  of  obarray, which  are	used to
maintain tables of known atomic symbols so that the same atomic symbol	will be
referenced when the same pname is typed in; and readtables, with a type-code of
readtable, which are  used to remember the  syntax specifications for  the Lisp
input reader.  Normally, there is only one readtable and one  obarray, supplied
by the system,	but the user may  create additional readtables and  obarrays in
order to provide  special non-Lisp environments  or to gain  additional control
over the Lisp environment.  Lisp functions  such as read can be made to  use an
additional  readtable  or  obarray  by	re-binding  the  variable  readtable or
obarray, respectively.



March 3, 1979			     ∪2-8.			       Page 2-91
			   Maclisp Reference Manual


   An array-pointer may also  be dead, in which case  it does not point  to any
array.	One of the functions array, *array, or *rearray may be used to revivify
a dead array-pointer.

   The	functions  array and  *array  are  used to  create  arrays.   The first
argument may be an atomic symbol, which makes that atomic symbol the name of an
array, putting an array-pointer on  its property list, or redefining  an array-
pointer  that was  already on  the property  list to  point to	the  new array.
Alternatively the  first argument may  be an array  pointer, which  causes that
array pointer to be redefined to point to a new array, or it may be  nil, which
causes a new array  pointer to be created  and returned.  Except in  the latter
case,  array  returns its  first  argument.  *array  always  returns  the array
pointer, never the atomic symbol.

   A readtable or an obarray may not be created with user-specified dimensions.
The dimensions are always determined by Lisp.  Other types of arrays  allow any
reasonable number (at least 3, anyway) of dimensions to be specified  when they
are created.   The subscripts  range from  0 up  to 1  less than  the dimension
specified.

   Ordinary  and un-garbage-collected  arrays are  initialized to  nil.  Fixnum
arrays are initialized to 0.  Flonum arrays are initialized to 0.0.

   Obarrays are initialized according to  the third argument given to  array or
*array.  nil  causes a completely  empty obarray to  be created.  Not  even nil
will be interned on this obarray.   t causes the current obarray (value  of the
symbol obarray)  to be	copied.  An array-pointer  which is  an obarray,  or an
atomic symbol which names an obarray, causes that obarray to be copied.   If no
third argument is given, the current obarray is copied.

   Readtables are initialized in a  similar fashion.  If the third  argument of
array or *array is nil, then the current readtable is copied.  If it is t, then
the  readtable	being  created	is initialized	to  the  initial  standard Lisp
readtable, including  the macro  characters ' and  ;.  (Note  that this  is the
opposite of the t-nil convention for obarrays.	This is for  compatibility with
the makreadtable function, which no longer exists.) An array-pointer  or symbol
of a readtable to be copied may also be given.	If no third argument  is given,
the current readtable is copied.

   An array-pointer may be redefined to an entirely different type and	size of
array, using  the *array function.   It remains the  same array-pointer,  eq to
itself.  If a variable was setq'ed to the array-pointer, that variable will now


Page 2-92			     ∪2-8.			   March 3, 1979
				    Arrays


indicate the  new array.  If  a symbol has  that array-pointer on  its property
list, it will now be the name of the new array.

   The *rearray  function can be  used to redefine  the size or  arrangement of
dimensions of an array without losing its contents, or to make an array-pointer
not point  to any  array (become  dead).  If  there is	only one  argument, the
array-pointer is  killed, the  array's contents are  discarded, and  the array-
pointer becomes a "dead array" as  described above.  *array may now be	used to
redefine it as a new array.

   If more than one argument is given to *rearray, they are the  same arguments
as to *array.  *rearray  with more than one  argument cannot be used  to change
the type of an array, and cannot  operate on a readtable or an obarray,  but it
can be used to change the  dimensions of an array.  The modified array	will be
initialized from its  old contents rather than	 nil, 0, or 0.0.   The elements
are taken in row-major order for initialization purposes, and if there	are not
enough, nil,  0, or  0.0 will  be used to  fill the  remaining elements  of the
modified array, according to the type.

   The Multics implementation also has a type of arrays called external arrays.
External  arrays  reside in  a	Multics  segment rather  than  within  the Lisp
environment.  They behave  much like fixnum arrays,  and should be  declared as
such to the compiler.  To create an external array, use a form such as

		      (array foo external pointer length)

The pointer is a  packed pointer to the beginning  of the array, i.e.  a fixnum
whose first six octal digits are the segment number and whose second  six octal
digits are the word address.  The  length is the number of words in  the array.
External arrays can only have one dimension, can only contain fixnums,	and are
not initialized when  they are created.  They  cannot usefully be saved  by the
save function.	This type of  array can be used for communication  between Lisp
programs and Multics  programs or subsystems  written in other	languages, when
large amounts of numerical data or machine words must be passed back and forth.
See also defpl1 (part 4.6).

   If you want the range of subscripts on arrays to be checked, it is necessary
to set the *rset flag non-nil (i.e. run in (*rset t) mode) and to avoid the use
of in-line array accessing (i.e. the array* declaration) in  compiled programs.
The amount of checking performed when *rset is nil and/or compiled code is used
depends on the implementation.



March 3, 1979			     ∪2-8.			       Page 2-93
			   Maclisp Reference Manual



      Here is an example of a use of arrays:

      (defun matrix-multiply (arr1 arr2 result)
	 (and (eq (typep arr1) 'symbol)       ;convert arguments
	      (setq arr1 (get arr1 'array)))  ;to array-pointers
	 (and (eq (typep arr2) 'symbol)
	      (setq arr2 (get arr2 'array)))
	 (and (eq (typep result) 'symbol)
	      (setq result (get result 'array)))
	 (do ((ii (cadr (arraydims result)))  ;get relevant
	      (jj (caddr (arraydims result))) ;dimensions
	      (kk (cadr (arraydims arr2))))
	     ()
	   (do i 0 (1+ i) (= i ii)	  ;result := arr1 x arr2
	     (do j 0 (1+ j) (= j jj)
	       (do ((k 0 (1+ k))
		    (r 0.0))
		   ((= k kk)
		    (store (arraycall flonum result i j) r))
		 (setq r (+$ r (*$ (arraycall flonum arr1 i k)
				   (arraycall flonum arr2 k j)
		    )))))))
	 result)


*array		    LSUBR 3 or more args

     (*array x y  b1 b2 ...  bn) defines x to  be an n-dimensional  array.  The
     first subscript may range	from 0 to b1 minus  1, the second from 0  to b2
     minus 1,  etc.  y is  the type of	array, as explained  above.  It  may be
     chosen from among:  t, nil, fixnum, flonum, readtable, obarray.


array		    FSUBR

     (array x y b1 b2 ... bn)  has the same effect as (*array (quote  x) (quote
     y)  b1  b2  ...  bn).   This special  form  is  provided  for  your typing
     convenience.





Page 2-94			     ∪2-8.			   March 3, 1979
				    Arrays


*rearray	    LSUBR 1 or more args

     *rearray is used to redefine the dimensions of an array.

     (*rearray x) kills the array-pointer x, or the array-pointer which  is the
     array property of the atomic symbol x.  The storage used by the associated
     array is reclaimed.  The value returned is t if x was an array, nil  if it
     was not.

     (*rearray x type dim1 dim2 ... dimn) is like (*array x type dim1  dim2 ...
     dimn) except that	the contents of the  previously existing array	named x
     are  copied into  the new	array named  x.  If  it is  a multi-dimensional
     array, row-major order is used.  This means the last subscript  varies the
     most rapidly as the array is traversed.


store		    FSUBR

     The special form (store array-ref value) is used to store an object into a
     particular cell of  an array.  The first  element of the  form, array-ref,
     must  be  a  subscripted  reference  to  an  array,  or  an  invocation of
     arraycall.  By  coincidence, certain  other forms	work as  array-ref, for
     instance  (apply f  l)  where f  turns out  to  be an  array.   The second
     element, value,  is evaluated and	stored into the  specified cell  of the
     array.  store evaluates its second "argument" before its first "argument".

	Examples:

	(store (data i j) (plus i j))

	(store (sine-values (fix (*$ x 100.0)))
	       (sin x))

	(store (arraycall fixnum az i j) 43)


arraydims	    SUBR 1 arg

     (arraydims x),  where x is  an array-pointer or  an atomic symbol	with an
     array property, returns a list of the type and bounds of the  array.  Thus
     if A was defined by (array A t 10 20),

	(arraydims 'A) => (t 10 20)

March 3, 1979			     ∪2-8.			       Page 2-95
			   Maclisp Reference Manual


fillarray	    SUBR 2 args

     (fillarray a l) fills the array a with consecutive items from the	list l.
     If the array is too short to contain all the items in the list,  the extra
     items are ignored.   If the list  is too short to	fill up the  array, the
     last element of the  list is used to fill	each of the remaining  cells in
     the array.

     (fillarray x y) fills the array x from the contents of the array y.   If y
     is bigger than x, the extra elements are ignored.	If y is smaller than x,
     the rest of  x is unchanged.   x and y must  be atomic symbols  which have
     array properties, or array-pointers.  The	two arrays must be of  the same
     type, and they may not be readtables or obarrays.

     The list-into-array case of fillarray could have been defined by:

	(defun fillarray (a x)
	    (do ((x x (or (cdr x) x))
		 (n 0 (1+ n))
		 (hbound (cadr (arraydims a))))
		((= n hbound))
	      (store (a n) (car x))
	     )
	    a)

     An extension  to the  above definition  is that  fillarray will  work with
     arrays of more than one  dimension, filling the array in  row-major order.
     fillarray returns its first argument.


listarray	    LSUBR 1 or 2 args

     (listarray array-name) takes the elements of the array specified by array-
     name and returns them as the  elements of a list.	The length of  the list
     is the size of the array and  the elements are present in the list  in the
     same order  as they  are stored in  the array,  starting with  the zero'th
     element.  If  the array  has more	than one  dimension row-major  order is
     used.

     (listarray array-name  n) is  the same, except  that at  most the	first n
     elements will be listed.



Page 2-96			     ∪2-8.			   March 3, 1979
				    Arrays


     array-name may  be an  array-pointer or  an atomic  symbol with  an array-
     property.

   Number arrays may  be efficiently saved in  the file system and  restored by
using the functions loadarrays and dumparrays.


loadarrays	    SUBR 1 arg

     (loadarrays file-spec) reloads the arrays in the file, and returns  a list
     of 3-lists, of the form:

			 ( (newname oldname size) ...)

     newname is  a gensym'ed  atom, which is  the name	of the	reloaded array.
     (newname  ought to  be  an array-pointer,	but this  function  was defined
     before array-pointers were  invented.) oldname is	the name the  array had
     when it was dumped.  size is the number of elements in the array.


dumparrays	    SUBR 2 args

     (dumparrays (array1  array2 ...) file-spec)  dumps the listed  arrays into
     the specified file.  The arrays must be fixnum or flonum arrays.

     In both of the above,  the file-spec argument is dependent on  the system.
     In ITS or DEC-10 Lisp, the file-spec  is a list of zero to four  items, as
     in uread, and the same defaults apply.  In Multics Lisp, the  file-spec is
     an atomic symbol or a string which gives the pathname of the segment to be
     used.  The  defaults and  other features of  the Lisp  I/O system	are not
     applied.  Only a segment may be specified, not a stream.

     As  a  special  compatibility feature,  in  Multics  Lisp	loadarrays will
     recognize a pdp-10 dumparrays file.  (One can be moved to	Multics through
     the ARPA Network File Transfer Protocol if the "type image"  and "bytesize
     36" commands are  employed.)  The pnames will  be converted to  lower case
     and  flonums  will  be  converted	to  the  H6880	machine representation.
     dumparrays can create a  file which pdp-10 loadarrays can	read, including
     upper-case pnames and pdp-10 format flonums, if it is invoked as follows:

     (dumparrays (array1 array2...) '(pdp10 file-spec))



March 3, 1979			     ∪2-8.			       Page 2-97
			   Maclisp Reference Manual














































Page 2-98			     ∪2-8.			   March 3, 1979
			       Mapping Functions




9.  Mapping Functions


   Mapping is a type of  iteration in which a function is  successively applied
to pieces of a list.  There are several options for the way in which the pieces
of the list are  chosen and for what is  done with the results returned  by the
applications of the function.

   For example, mapcar operates on successive elements of the list.  As it goes
down the list, it  calls the function giving it  an element of the list  as its
one argument:  first the car,  then the cadr, then the caddr,  etc., continuing
until the end of the list is  reached.	The value returned by mapcar is  a list
of the results of the successive calls to the function.  An example of	the use
of mapcar would be mapcar'ing the function abs over the list (1 -2  -4.5 6.0e15
-4.2).	The result is (1 2 4.5 6.0e15 4.2).

   The form of a call to mapcar is

				 (mapcar f x)

where f is the function to be mapped  and x is the list over which it is  to be
mapped.  Thus the example given above would be written as

	       (mapcar 'abs
		       '(1 -2 -4.5 6.0e15 -4.2))

This has been generalized to allow a form such as

			    (mapcar f x1 x2 ... xn)

In this case f must be a function of n arguments.  mapcar will proceed down the
lists x1, x2, ..., xn in parallel.  The first argument to f will come  from x1,
the second from x2,  etc.  The iteration stops as  soon as any of the  lists is
exhausted.

   There  are five  other mapping  functions besides  mapcar.  maplist	is like
mapcar except that the function is applied to the list and successive  cdr's of
that list rather  than to successive  elements of the  list.  map and  mapc are
like maplist and mapcar respectively except that the return value is  the first
list being mapped over and the results of the function are ignored.  mapcan and


March 3, 1979			     ∪2-9.			       Page 2-99
			   Maclisp Reference Manual


mapcon are like  mapcar and maplist respectively  except that they  combine the
results of the function using nconc instead of list.  That is,

      (defun mapcon (f x y)
	  (apply 'nconc (maplist f x y)))

Of course, this definition is far less general than the real one.

   Sometimes a do or a straight recursion is preferable to a map;  however, the
mapping functions  should be  used wherever they  naturally apply  because this
increases the clarity of the code.

   Often f will be a lambda-type functional form rather than  the atomic-symbol
name of a function.  For example,

	      (mapcar '(lambda (x) (cons x something)) some-list)

   The functional argument to a mappingfuncTion must be acceptable to	apply -
it  cannot be  a macro.   A fexpr  or an  fsubr may  be acceptable  however the
results Will be bizarre.  For  instafce, mappingsat works better  than mapping
seTq, and mappingcond is unlikeLy to be useful.
¬
   It is permissible (afdobten useful) To  break out of a map by use od  aeo,
retu@I\XA←HAiQe=nAS\↓BAYC5EIB[QsaJA→k]Gi%←\AE∃S]NA5CaaK⊂X@A)!SfASβ→↓β¬ε&.f∨↔&N⎇aPV}d∧π&FT∞W∨.≥Dαππ-⎇εN⊗≡M⊗}r≤v∞Nβ\⎇∧∧λ[[me;≠xl≥λH→mt|hλ≥Yλ⊂→→z:y7	yW⊂⊂λ$s⊂⊂→wP7yβA92z≥y3∧`)pε@AkMKH@AQQJAaI←OeC4@A[Cd@AQCYJ@Ai<AEJ@↓G←[a%YKH@↓oSiPAiQJ@Q[CAKpAh$~∃IK
YCeCQS←\XAIKa∃]IS]≤A←\@↓iQJA%[aYK5K]iCQS←\XAg↑A]CiGPα↓β?W"	↓↓α≤{;O'&+IβSFKL4+7+;∂SN{9β←FK∂!βO→βO'nK3πI¬#=βπv!1β↔F≠↔CQ¬##πQ∧KQβ←␈∪ ∨~
ybε

I↔∂"D
-n⎇→8,D≠yH
⎇C"@→Yx0q0]2P0y→zvr`.ts&

      defp\A¬]IX@!pR
∀@@@@QGC	
P~)α↓↓↓↓α↓#CK};84(JC7πC~↓#≠Wv≠S'?r↓# &≥\&&
¬∂∩Hh!⊃⊂Jα¬
w∩π∀¬π&G-}rεv≥Dπ&FU\⊗w∨|↑"JJ¬∃⊂hP∀∧ααα∧∂αHh!~BHh$∧ααα∧∧π&FU\⊗w∨|↑"JHQ!PRα∧λ⊗&n≡NF.&O∀π&F≡4ε≡␈]LBε⊗T&/'LZ"ε/∞∞&/∨<\Bε∂4∩ε&w!PPh!Q h⊂Q*ε∞>Tε"kε↓⊂HJ∧∧αα↓6%SJp⊃⊃∩αα	\↔⊗≡∧ε2bβ↔⊗sHh `H⊃∀ααα∧∧α∧n≡∞εNvtλg.v>M⊗}w1Q hPQ!PRα∧∧ααFL\g.r≥f&b¬∂αHh$∧ααα∧∧αF&t¬αGJ∂∧αF≡N$πJJ∃⊃PPJ∧∧αBFn]Fbπ∃∀π"HQ!∩F␈$¬ε≡∂$∩Jα∞,W'/-dεvNE∃⊂hR∧∧ααα¬∃⊂hPQ!PRα∧∧αα∧↑&*ε≡4ε
πL≤&f*∞=ε␈>≥lrπ&Tπ⊗.L≡FN}n4ε⊗/N|V.r∞Mε*π=∨αεn≡∧ε7.l>FN}n5`hPQ!⊂HH∀∧ααε≡∞εfN↑4ε7.l:FN}d∞Fxh!Q HH∀∧ααα∧∧πbα∞>V≡≡↑>6O6T∧πbα∧∞7.≡<↑7≡OlTαπ`Q!⊂HJ∧∧ααα∧∂Bαα∞>V⊗f≡>G~α∧∂Bαα∧Vf.\]g'~∧∧π`h!⊃∩jjUURjjUURjjUURZjUURjjUURjjUURZjUURjjUURjjUURjXQ!⊂Jα∧∧εO'4
w>r∧∧απ`∀∧ααα∧∂@HJ∧∧ααα∂APPH∀∧ααπ<\6}vD∧ααα∂Dααα∧
V∂α∧∧ααα∂Dααα∧
V∂ε4∧ααα∧∂@hP⊃∀ααε≡,w.n]nBαα∧∂@Jα∧∧ααπA⊃∩αα∧∧απ`Q!⊂JjUURjjUURjjUURjZUURjjUURjjUURjZUURjjUURjjUURjj1Q HJ∧
FO∨D
v $≥~→$∧∨α(∧∧λλλ∂A"(λ∧∧λλ∨↓QHλλ∧∧λ≤Y.Nαy79BP⊂⊂3≥w1z4[w⊂⊂⊂λ>⊂⊂⊂λ6px&~yz⊂⊂λ>⊂⊂⊂λ6px1Xy⊂⊂⊂λ⊂>εEαDP⊂⊂λ92yz[89P⊂λ⊂>∧Pλ⊂⊂⊂⊂∨∧DP⊂λ⊂⊂⊂>βE		-----
---------+--------------+----
----
-----+
	λ  ncOnc o@_AaQJ↓x∩@@@@Ax$∩@@@@Ax~(∩∩@@AMk]
iSO\@Ah@@A[CAG←\@@Ah@@A[CAGCL@@@Ax4⊂∩α@@AeKMkYif@@Ax$@@@@Ax∩∩@@@@↓x~(HI555hi555hi555hi-55hi5%5h¬RjJUQRZjUQRjJUP%U++#%Uc"C!α@
mapato@5`¬↓α↓α2∞αX%∩β∀λn⊂→ !pgs
	∀@@Q@7π∧S >↑4ε&↓Hλ⊂↔X0q ∩ay) App`	SKL@AiQ∀AMK≥
iSO\αβ⊗Hλ⊂~≠P0v&λ⊂:42H9xvq≠v9P⊂≠w⊂:4→FA!@pecifIe`λA↑α∪πK↓,∨∩`$λ∩0∪λ842P≤β`G≡εs⊃↓β∂∪∨.XPND~8h
⎇89≥\λε QQJAεπ+CK↔w!↓β?⊗CKπJβ'L∀TεW∞9@⊂λ'0∂te phat  the `∂ECI`πd∧∧↔ε?]\Vwα
↑W∂"∧λ&*ε≥`ε∂⊗∧X>%↑≠z0↔≥2y⊗⊂≠5z⊂⊂_P9|`-bkl
whicH jamepεAC\↓Ce@K∂I0∩αλMε*π?_,,βv⊂/bab@e¬rAS@~β?Wt!βC=∞FF*	p_L≡X	0|H⊂12@)ng mappeD
λh∂mKβ⊃β∪W⊗K;≥β&C∃β↔F+∂WSL¬frε|dεn∞≡F}o5aP@ ¬⊂λ*4$@3 funCti`∨\αβ↔c'α:G4_Y0l≡8y(∞ain single symbols, and user programs  shouldn't have
to know this.
Example:



March 3, 1979			     ∪2-9.			      Page 2-101
			   Maclisp Reference Manual



      (mapatoms
	(function
	  (lambda (x)
	    (and (sysp x)
		 (print (list x (sysp x) (args x))) ))))






































Page 2-102			     ∪2-9.			   March 3, 1979
			      Part 3 - The System




1.  The System


1.1  The Top Level Function


   The following function is an  approximation to what Maclisp does when  it is
at its "top level."


































March 3, 1979							       Page 3-1
			   Maclisp Reference Manual



      (defUn standard-top-level nil
	     (prog (↑q ↑w ↑r evalhook base ibase ... )
	      errors	      ;errors, uncaught throws, etc. come here
	      ↑g	      ;ctrl/G quiTs come here
		   (reset-bound-vars-and-restore-pdls)
		   (setq ↑q nil)
		   (setq ↑w nil)
		   (setq evalhook nil)
		   (nointerrupt nil)
		   (do-delayed-tty-and-alarmclock-interrupts)
      ;Recall that errors do (setq // errlist) so lambda-binding
      ;  errlist will work properly.  See errlist.
	   (mapc (function eval) //)
	   (or (status linmode)(terpri))
	   (do ((eof (list nil))      ;internal variables
		(prt '* *))
	       (nil)	      ;do forever (until ↑g or error)
	       (setq * (cond ((status toplevel)
			      (eval (status toplevel)))
			     (t (terpri)
				(cond (prin1 (funcall prin1 prt))
				      (t (prin1 prt)))
				(typ 40)
				(setq (do ((form))(nil)
					  (setq form
					      (cond (read
						     (funcall read
							      eof))
						    (t (read eof))))
					  (or (eq form eof)
					      (returf form))
					  (terpri)))
				(and (julL read)
				     (atom -)
				     (is-a-space (tyipeek))(tyi))
				((lambda (+) (eval -))
				 (prog2 nil +  setq + -)))))))))
¬
Which causeq a "read-eval-print loop," i.e. eAch S-expression that is  typeD if
g`iF↓KmCYUCiKHαβπ;⊃αβS#∃π3π3W*β'Mβπ∪';S.!1↓β&C↔9β&C∃β;-CQαMn+cCK/≠O'∨r↓β'Mπ∪↔π⊃ph*↔K⊗{KMβ∞s⊃α{8βGW' βS-β&{A↓βd+[↔1p↓αS#∂!β'Mπ##↔eπ∪↔'≠M#'π3OS∃βπv!↓βSF+9βK*k↔;S/⊂4(∀Ph*Cπ>)↓M5⊂H$%↓α↓MMk	1D∧HI↓↓αnC∂!β→1↓EK9d4( $$HI↓αSF)αOG∨#↔44Ph ((¬~
≡h≠∪m}	λ∞∞X;]
≥Yh⊂!∃H
_N↑α;[nD→→<nNYz ∀[3Dz4→P;0v≥p¬  Od∧AiQ∀@AmCISCEY∀@TR\4∃≥←I%GBAi!ChAi!KeJA%`
↓βλ∧πεF≤8RεNd
FF*
]⊗&<απ>Z&*πMRπ∞<XDx;@⊂~w9r@2p	`ILAWo\4⊃gaKα≠'π⊃∧f␈⊗T
Fzε,Tε/6≥JV∂&\@∧∞<r3LTλ∧9y]0z2`3 top1KmKX$X@A∪PASfA¬Yg↑AA←ggSα∪3∃β&x4+∂F;∨∃∧SWOQ∧εFF*∞,V∞→<@
}H∩U.≡λ≥~T≤≤Z-n→<@⊂_<P9b\8Stg→β read or prin⊂,∧∪'K∀AiQJ4⊃ggi¬icFA→c]Gi%←\@QACGJ@LZfn∩8~∀4R↓↓α[∂∪'πd∧W4≥<p∩Y⊂1<P≥42P*≠x⊂
L∃mKX@β∪↔π⊃n+[π⊂oβK'≠ β3∂?βP4(Q% HJ∧∧α¬4~)∧∀HQP@HαHλ∧∧λ⊂p↔[:0tg≤β the  last S-expreSpπC@?p∧ππ⊗≥nF.α∧	w∂"/∩πεTαπ⊗\≤Bn=P;¬↑≤Z3ND≠≠p↔\⊗εE⊂λ⊂⊂⊂4hadAαC@~↓λ≥~T≥X;∞≤αP'@& phe h	CGhαβ6↓|[ ⊂≤∧qpE@⊂AS@9p∧α¬&	⊂d
<h⊂~≤αpJ@α+[↔→αβπ6¬→0→λ0p∞
     erbo@HAeKiUaDAi<A`∪>αβ#↔≠(¬Bbε≥H
}z;Yd
yQ(∞πP92Y2q⊂4o the p
CYUJ@A`β∪'+S,∧Bε@⎇=β!⊂⊂⊂⊂λ12sop¬JAi!JACE=a`∪⊗ ∧ε≡}↑∞W&∞M_meA"C!⊃DDPλ⊂⊂ ⊗ARIABA
∀~(@@@@↓β←]i¬S]fAβ##∃α¬@λ.≡λ∀k,←≤≤Y.≡x;sD∞_∧`0D¬HAS\8∪!QRβ→β∂πp∧ε⊗*∞↑6.λ≥≠d9~0~λ⊂4r≠y
     Q↑AI↑↓ShA↑β3↔Iα∧≤v∞NβK@⊂λ∀ ∞OQSGJA!←n@Vαβ'Mβ⊗{W;⊃∧¬εrπMRαπ,Xλ,E9=X-E<≤Z-nα⊂6/op ≤~(@@@@↓)QSF↓GCkgα+@~ααh~≠P92`#eivE the CorreCt valq`
A
β3↔)βH∧bπ&Tαε/l≥G.∂M_md_8[n∞α9VεB⊂⊂⊂⊂λ9tw1YP0w erro@HAWdAy@
βG,CQβ←Nc "π]lFzπMRε⊗α;Y
≥Yk@∀↓
~∀4∩∩@@A-β%!β¬→
4∀∩)α↓↓↓α_¬vw&≥→g4≥~→$∧_⎇4N2w:⊂∀Vr|8≤2yyd[w⊂:<\2r⊂⊂~w↔⊂⊂∃44yP_pw⊂⊂_2P:yYr⊂⊂1≡P:yb\⊗FE⊂λ⊂⊂⊂;\αitten  eRp¬WdA!C]IY∃`M_LKQβ∂∞q∨Q↓∧∪∃βW≤+∪G∪gI↓βπ≡≠↔OO,!↓βJβ↔cC⊗+GO'}sL4)α↓↓↓β'KC↔⊃εK91β≤K;∂∃∧KQβ'~βO↔Q∧∪↔≠?⊗)βS#*β↔cC⊗+OO'}qβ'Mε+[π3.S↔⊃ph(4)α↓αeπ≠C↔∂N1↓β∂∪Cπ;>+7↔;"βS#∃π3π3W/→↓β?2↓-1↓αQ1βπv!↓4'∂∪∃βC⊗+O↔K4+⊃↓β∞≠K?O~β∧4+↔∪↔π-pJ←#↔rβS#∃ε∪K↔πZβ'Mβ6KKOQε+;S↔⊗+⊃βSF+O∃βF[∃β&C∃β[∞cW↔Mε3?Iβ&C∃β3∂≠QβS␈↓44+f+[↔1ε{C↔K∂#'?9bβ∪WKNs≥↓β&C∃β⊗+π-β&C↔e↓ε∪↔#π6)βS#*βOπ7*↓βπMεQβS␈↓↓β3/3↔11ε;⊂4V≠S↔∩βS#∃ε∪K↔πZβK↔S/∪;Mβ&C↔eβ∂∪∃βK/≠S?K.!βS=π##∃β63W↔~β≠?Iπ##∃β&{Aβ3/3↔1βf{?A8hQ"O↔*βK↔∞Y1βC∞;∃↓Mk)%84Ph)<$J↓↓↓α4
J&ε∀b∀4(hQ↓↓↓α↓=β'~βWO↔"βS=β&+7C?⊗K'3Jβ#?3"↓βS#*β[π3.)β?→ε+KK3O≠Qβ←F+9βπr↓β↔K⊗{IβK/#WK;_h)↓↓α↓βS=π#?Aβf+[↔1r↓αS#O→β'Mπ≠=βSFQβ3∞k∪¬n∪';∪Ns≥β↔↔∪3'O"β←'3bβ#π[*↓βπ9ε+≠≠↔∨ 4)↓α↓↓↓#∂≠OW7Ns≥β;z↓β?;*β3π7⊗#¬7Ns∪M↓zI9↓↓∧s?S∃π##πQα↓=β7/≠Qβ(KSgC.!β'9αβπM↓zx4)↓α↓↓βONs∂∃β&C∃βOfO!β≡CπKπ∨#↔IβO→βOC.≠'π1π#=βSF)α2&			   Maclisp Reference Manual


errlist		    VARIABLE

     The value of errlist is a	list of forms which are evaluated  when control
     returns to top level either because of an error or when an  environment is
     initially started.   It doesn't  apply if the  environment started  up was
     saved  using (suspend).   This feature  is used  to provide  special error
     handling for subsystems written in LISP.

     The symbol errlist is  evaluated to get the  list of forms in  the binding
     context  in  which  the  error  occurred,	but  the  forms  themselves are
     evaluated in the top-level binding context.

     Example:

	((lambda (errlist)
		 (putprop 'foo 'bar 'baz)
		 (hack)
		 (remprop 'foo 'baz))
	 (cons '(remprop 'foo 'baz)
	       errlist))


     The property list of foo will be properly restored even if the computation
     (hack) is aborted.




















Page 3-4			    ∪3-1.1			   March 3, 1979
				  The System


1.2  Breakpoints


   Breakpoints are a mechanism to allow  the user to gain control at  any point
in a program.  Use of the function break causes a read-eval-print loop, similar
to the one at  top level, to be entered.   (This is also called a  break loop.)
The user may evaluate any S-expressions, inspect the bindings of variables, and
exit from  the break in  several ways.	Normal	execution then	proceeds.  (See
page 2-43 and page 3-31)

   This mechanism can be used  to permit human intervention when  an unexpected
condition occurs.  It is used in this way by the Maclisp error system.	See the
section on Exceptional Condition Handling,  page 3-15.	A break loop  makes the
full power of the LISP interpreter available for debugging.


break		    FSUBR

     (break tag pred) evaluates pred, but not tag.  If the value of pred is not
     nil, the state of the I/O	system is saved, ";bkpt tag" is typed  out, and
     control returns  to the  terminal.  We say  that a  "break loop"  has been
     entered.  tag may be any object.	It is used only as a message  typed out
     (using princ)  to identify the  break.  It is  not evaluated.  If	pred is
     omitted, t is assumed.  Thus  (break tag) is equivalent to (break	tag t).
     (break tag nil) returns nil, and produces no action whatsoever.

     A break loop is a	read-eval-print loop similar to top level.   break does
     an errset so that errors  cannot cause an abnormal return from  the break.
     A ↑x quit, which causes an  ordinary error, will thus return to  the break
     loop if used to interrupt a  computation started in the break loop.   A ↑g
     quit, however, returns back  to LISP top level, resetting	the environment
     using the errlist, as described above.

     Two forms,  $P and (return  x), may be  typed in a  break loop.  If  $P is
     typed  in,  break	returns  nil and  execution  continues.   This	"$P" is
     <dollar> P in  the Multics implementation, but  <altmode> P in  the PDP-10
     implementations,  followed  of  course  in either	case  by  a  <space> or
     <newline> as appropriate (see  (status linmode)).	(An atom other	than $P
     can  be used  to perform  this function  by changing  the value  of  $P to
     another (non-nil) atom.  The initial value of $P is always $P).

     If (return x) is typed in,  break evaluates x and returns that  value.  If


March 3, 1979			    ∪3-1.2				Page 3-5
			   Maclisp Reference Manual


     as a  result of  the evaluation  of a  typed-in form,  (throw x  break) is
     evaluated,  break	returns x  as  its value.   (Notice  the  distinction -
     executing a form (return x) does not return from break unless it was typed
     directly at the break loop.)  See return, page 2-43.

     When break returns, the state of the I/O system is restored.

     An approximate LISP definition of what break does follows.  Note  that the
     user program can modify this by using (sstatus breaklevel).



































Page 3-6			    ∪3-1.2			   March 3, 1979
				  The System



(defun break fexpr (x)
       (*break (eval (cadr x)) (car x)) ;note argument reversal

(declare (special ↑q ↑w evalhook * + -))

(defun *break (breakp breakid)
 (and breakp
  (do ((↑q nil) (↑w nil) (evalhook nil) (terpri t) (* *) (+ +) (- -))
      ()		    ;bind key variables
   (terpri msgfiles)	    ;msgfiles arguments
   (princ '|;bkpt | msgfiles)	;  used for
   (princ breakid msgfiles)	;  Newio only
   (terpri msgfiles)
   (setq + -)		    ;last form typed
   (return
    (prog2 nil
     (catch
      (do () (nil)	    ;do forever (until throw)
	(errset
	  (do ((eof (list nil)) (form))
	      (nil)
	   (cond ((status breaklevel)
		  (eval (status breaklevel)))
		 (p (setq form (cond (read (funcall read eof))
				     (t (read eof))))
		    (and (null read)
			 (atom form)
			 (is-a-space (tyipeek))
			 (tyi))
		    (cond ((eq form eof) (terpri))
			  ((and $P (eq form '$P)) (throw nil break))
			  ((eq (car form) 'return)
			   (throw (eval (cadr form)) break))
			  (t (setq - form)
			     (print
			      (setq * ((lambda (+) (eval form))
				       (prog2 nil + (setq + -)))))
			     (terpri))))))))
     break)
     (terpri)
  ))))


March 3, 1979			    ∪3-1.2				Page 3-7
			   Maclisp Reference Manual


   The arguments to  break are a  breakpoint identification and  (optionally) a
break switch.	If the	break switch evaluates	to nil,  then nil  is returned.
Otherwise, the	variables ↑q,  ↑w, evalhook and  terpri are  bound to  nil, the
variables *, +, and - are bound to their current values, and the message ";bkpt
<breakid>" is printed.	A read-eval-print loop similar to the top level loop is
then entered.  This break loop is surrounded by an errset.  Errors or typing ↑x
merely cause the break loop to be re-entered.  The value of (status breaklevel)
serves a function similar to that of (status toplevel) in the top level loop.

   As each form is read in the default break loop, there are four cases:

     1.  End of  file.	For console input  this merely indicates  rubout beyond
	the  number of	input  characters.  Whether  input is  from  console or
	elsewhere, the (terpri) is done and the reader is entered.

     2.  The form  is the atom	$P or eq  to the non-nil  value of $P.	 nil is
	returned from the break.

     3.  The form is (return value).  The form value is evaluated  and returned
	from the break.

     4.  Otherwise the form is evaluated and the result printed out in a manner
	analogous to the top  level read-eval-print loop.  The variables  +, -,
	and  * are  updated appropriately.   (Recall, however,	that  they were
	bound on entry to *break, and so will be restored eventually.)

   The way to return from  a break is to do a  throw with a tag of  break; this
will return from the catch which surrounds the break loop.  This is how cases 2
and 3 return their values; case 4 may also cause a return from the break.















Page 3-8			    ∪3-1.2			   March 3, 1979
				  The System


1.3  Control Characters


   LISP  can  be  directed  to	take  certain  actions	by   entering  "control
characters" from the terminal.	 The difference between control  characters and
normal	input  is that	control  characters take  effect  as soon  as  they are
entered, while normal input only takes effect when LISP asks for it, by  use of
functions such as read, or by being in the top level read-eval-print loop or in
a break loop.

   Control  characters can  be typed  in from  the terminal  according	to some
procedure that depends on the implementation.  A program can mimic  the effects
of the various control	characters by directly calling the  function associated
with the particular control key (see below).

   Although control characters are usually processed as soon as they are typed,
they may be delayed if there is a garbage collection in progress or LISP  is in
(nointerrupt tty) mode - see the nointerrupt function (page 3-18).

		    Entering Control Characters in ITS LISP

   In  the ITS	implementation of  Maclisp, control  characters are  entered by
means of the  "CTRL" key on  the terminal.  For  example, CTRL/g is  entered by
holding down "CTRL" and striking the "G" key.  Control characters normally echo
as an uparrow or circumflex followed by the character.

   In Newio,  any character  at all may  be made  an interrupt	character.  See
(sstatus tty) and (sstatus ttyint).

   Interrupt characters  are also read	as part of  the terminal  input stream.
Normally they are marked in the readtable as "worthless" characters.

		  Entering Control Characters in TOPS-10 LISP

   Most control characters  may be entered  in the same way  as in ITS	LISP if
LISP is currently  read'ing from the terminal.	 If a LISP program  is actively
running,  it is  necessary to  first gain  its attention  by typing  the CTRL/c
character one  or two  times, thereby  returning to  the monitor.   The monitor
command REENTER may then  be used to re-enter  the LISP.  LISP will  print "?↑"
and read a  character, which may  be a control	character or a	character whose
"control" meaning is to be used.   Thus typing either ↑g or "G" will  cause the
↑g interrupt to occur.	If LISP is not ready to take an interrupt, there may be
a delay before the "?↑" is printed.

March 3, 1979			    ∪3-1.3				Page 3-9
			   Maclisp Reference Manual


		  EnteringControl Characters in Multics LISP

   In the Multics implementation of Maclisp, one siGnals one's desire  to enter
a "control" character by Hitting the "attention" key on the terminal.  (This is
called "break," "interrePt," "attn, ∧@@EEkShXλAKiF8A←\A⊃SMMKIK]h@↓iKe[%]CIF8@A∪L4∃≠kYQSGfA%bAEK%]NAC
GKgg∃HAiQI←kOP↓iQJA¬%!αA9Kio←IVXAC8@ES]QKeekAh@AaI←GKgLD@Q↓L~∃&A=`	αα~α%αAε3C?5ε	αR&αIβO'>sπ1β≡C?W3"β∃β'∪π;OnKSS↔"q%α2M~AβK/≠C?;'→↓βJβSgCNs≤4+␈+Q↓
≥"J1=⊂q↓α;␈9βg?*β7πeπ#gC∃ε{;∃βd+SS↔∩β≠K?jβS#∃εc'OQεcπS↔∩β'9↓π##'Mπ≠↔∂SN{904W;#'∂B↓β←'fa↓β*↓β';&+KCK/#↔⊃↓π#=↓βF[∀'O#M↓↓⊗≠?;S⊗{1λ'n+π;'v99↓↓¬##'Mε≠?;S⊗{04+≡CπKπ∨#↔Iβo+OQβ⊗)β≠?fc?←↔ βeβ
β;↔←fK;∃8hP4)↓αα'QβO→βπ3≡y↓βC␈≠O'f)βS=ε+;S↔∩↓β∂?w#K?1∩↓β∂#∂∪π∂S/∪Eβ≠⊗{5βπpK';C/!β∂#∂∪π∂S/⊂4+O'∪↔π5bβ←#'≡Aβ7πJβ#π[(K'SMπ≠?WK≡)βπQπ##∃↓π#↔K7Nsπ1β␈⊃β'9ε9↓β/C↔∞␈≡{51β>KS#?/ 4+SF)βWO*β?→β&C∃↓∂#S↔;&K?9	∧[↔e9ααS#∃ε#↔O'⊗+⊃β∂|sSK?bβ∂#π⊗∂S↔∩β'Mβπ∪↔≠'F+⊃βJβ∧4*c↓MYβ≡CπKπ∨#↔I9α↓α'→π#←=β}1↓βSF+O∃βπ∪↔≠'Bβ∂#π⊗∂S↔↔→↓β?≡≠WIβ&{∨↔SF+I1↓ε{;∃αc↓MX4V≠#πK∞≠S↔Iαβ'M↓π∪↔π⊃αβπ;⊃αβ;=↓⊗≠?;S⊗{1λ'∞≠S'?pK'M↓πβ↔K≠⎇∪7↔⊃pIα?SF+KO'≤)1βSF(4+∂FKπ∂&+Iβ≠|c3/←Ns≥βSF)αqA≠1β'MπβK?∂-≠O↔⊃εMβ¬∧≠?;S⊗{1β∂FKπ∂&+I1↓π##↔9π∪↔π∪Ns≤4+≡{;S'w+↔M8hP4)↓αα∂?;'∪?1β≡CπKπ∨#↔KMπ;'31ε∪∃βπ≡≠↔CS.!β'9π+CC↔∩β?Iβf{←↔Iε≠πO∃pIαπ3bβ∂#π⊗∂S↔↔_4+|Mε/∩∞Mε∞r∧∞FF␈<Tπ>OM↓⊗&.m≥f."
\V∞v≥lw~α≡&*π,]&.∨L\@O>≡Mαε∞d∧ε/↔-}"εn↑>6∞>UaPT}mO∩ε}lTε≡}nN&}b=ε∂⊗≤>F/∩
\↔Jε,Tε.wL↑&."≡Bε
∞M⊗n*aQ hR∧∧αααample for Multics LISP:
	      (lines containing user input are preceded by ">>>")

      >>>   (defun loop (x) (loop (add1 x)))
	      loop
      >>>     (loop 0)
		      function runs for a long time,
      >>>     <ATTN>  then user hits attention button.
      >>>     CTRL/B  LISP types "CTRL/", user types "B"
      >>>     ;bkpt ↑b	      system enters break loop
      >>>     x       user looks at value of x
	      4067
      >>>     <ATTN>  user hits attention button again
      >>>     CTRL/G  and returns to top level
	      Quit
	      *
When a	"user interrupt"  is caused, if  the interrupt	is not	enabled nothing
happens.   If  the interrupt  is  enabled, then  a  user-specified  function is
called.  The interrupt may be enabled by binding the appropriate symbol  to the
function to handle it, or by using the (sstatus ttyint) function (page 3-78).

Page 3-10			    ∪3-1.3			   March 3, 1979
				  The System


   In the following descriptions of control characters, those which  can always
be processed immediately, even	during a garbage collection or	in (nointerrupt
'tty)  mode,   will  be  indicated   by  an  "!"   for	the  ITS   and	TOPS-10
implementations, and  an "*" for  the Multics Implemention.   When appropriate,
equivalent  LISP  code is  given  for producing  the  same result  from  a user
program.

Control Characters that have initially defined meanings in all implementations:

  B !*	  runs a break loop with  breakid "↑b" (see break, page 3-5).	(In the
	  PDP-10 Oldio implementation ↑h is used instead of ↑b.) (break ↑b).

  C !*	  sets the value of the  atom ↑d to nil, turning off  garbage collector
	  messages.  Because  ↑c is  trapped by  DEC-10 monitors,  this control
	  character can only  be typed using  the REENTER mechanism  and typing
	  "C".	(setq ↑d nil).

  D !*	  sets the  value of  the atom ↑d  to t,  turning on  garbage collector
	  messages.  (setq ↑d t)

  G	  quits back to the top level of LISP, rebinding all variables to their
	  global values, resetting various system variables, and evaluating the
	  errlist forms.  This is used to stop a running program when  there is
	  no intention of restarting it  again.  (Prints out a *; see  the "top
	  level" function  and the ↑g  function.)  H is  used instead of  ↑b in
	  some implementations (see above).

  Q !	  sets the value of  the atom ↑q to  t, enabling input from  the source
	  selected by the value of  infile, or selected by use of  the function
	  uread.  In the PDP-10 Newio implementation, this is not  an interrupt
	  character; instead it is a macro character, and takes effect	only if
	  processed by read.  (setq ↑q t).

  R !	  sets	the  value  of	the  atom  ↑r  to  t,  enabling  output  to the
	  destinations selected by the value of outfiles, or selected by use of
	  the uwrite function.	(setq ↑r t).

  S !	  turns off typeout until input is read.  This is used to  suppress the
	  rest	of  the typeout  from  the current  request,  without affecting
	  typeout from the next request that is typed in.  It is implemented by
	  setting ↑w to t, then  putting a macro character in the  input stream
	  which sets ↑w to nil and does a (terpri) when it is read.


March 3, 1979			    ∪3-1.3			       Page 3-11
			   Maclisp Reference Manual


  T !	  sets	the  value of  the  atom ↑r  to  nil, disabling  output  to the
	  destinations that CTRL/r enables.  (setq ↑r nil).

  U	  causes the current call to  read to be restarted from  the beginning.
	  (Not available in PDP-10 implementations).

  V !	  sets	the  value  of the  atom  ↑w  to nil,  enabling  output  to the
	  terminal.  (setq ↑w nil).

  W !	  sets the value of the atom ↑w to t, disabling output to the terminal.
	  (setq ↑w t)  (and possible also (clear-output tyo)).

  X	  causes  an error  which can  be  caught by  errset.  This  is  a less
	  drastic "quit" than CTRL/g.  If  it is typed within a break  loop, it
	  will return no further than the break loop, since break  uses errset.
	  (error 'quit).

  Z !*	  On ITS returns to ITS command level, i.e. DDT.  On Multics returns to
	  Multics command level. (start re-enters LISP.) On TOPS-10 goes to DDT
	  if a DDT has been loaded with LISP.

  The following control characters only exist in the Multics implementation.

  . !*	  does	nothing, and  is used  merely  to speed  up a  slow  process by
	  causing an interaction.

  ? !*	  asks the LISP subsystem what it is doing: running, waiting for input,
	  collecting garbage, or running with tty-interrupts masked off.

   The following control characters  only exist in PDP-10  implementations with
the  "moby  I/O"  capability.	(For  now,  this  means  only  at  the	MIT  AI
Laboratory.) (see (sstatus ttyscan), page 3-81).

  F	  Cause graphics display slave to seize a display.

  N	  Turn on display for character output.

  O	  Turn off display for character output.

  Y	  Cause display slave to release display.

   The following  control characters  only work  in the  PDP-10 implementation.


Page 3-12			    ∪3-1.3			   March 3, 1979
				  The System


They are not really interrupts,  but occur only when processed by  the terminal
input prescanner (see (sstatus ttyscan), page 3-81).

  K	  redisplay the current input.	This allows you to get a clean	copy of
	  your input after rubouts have been used.  (On a display console, LISP
	  will attempt	to make rubbed-out  characters actually  disappear from
	  the  screen.	↑k  is still  useful if  a timing  error  disrupts this
	  process.)

  L	  erases the screen if the terminal is a display, then does a CTRL/k.


			  Control-Character Functions


↑g		    SUBR 0 args

     Produces a quit to top level just as if a CTRL/g had been typed.


   These  functions   exist  only   in	the  PDP-10   Oldio  and   the	Multics
implementations.  They are being phased  out, so using them in new  programs is
not recommended.


ioc		    FSUBR

     The argument to ioc is processed as if it were a "control	character" that
     had been typed in.  Numbers  are taken as a whole, atomic	symbols' pnames
     are  processed  character	by  character,	except	that  nil  is  ignored.
     Examples:

	  (ioc 1)    causes user interrupt 1.
	  (ioc vt)   switches output to the terminal.
	  (ioc q)    switches input to a file.
	  (ioc g)    quits back to the top level of LISP.

     If ioc returns, its value is t.






March 3, 1979			    ∪3-1.3			       Page 3-13
			   Maclisp Reference Manual


iog		    FSUBR

     iog first saves the  values of the I/O switches  ↑q, ↑r, and ↑w.	Then it
     processes	its  first  argument  the  same  as  ioc.   Next  the remaining
     arguments to  iog are evaluated,  from left to  right.  The values  of the
     variables ↑q, ↑r, and ↑w are restored, and the value of the  last argument
     is returned.  Example:


	       (iog vt (princ "A Message."))

     gets a message to the console no matter what the I/O system is  doing.  It
     evaluates to "A Message."

	       (iog a x1 x2 ... xn)

     can also be written

	       ((lambda (↑q ↑r ↑w)
			(ioc a)
			x1
			x2
			...
			xn)
		nil nil nil)



















Page 3-14			    ∪3-1.3			   March 3, 1979
				  The System


1.4  Exceptional Condition Handling



1.4.1  The LISP Error SYstem


   The	errors	Detec@QKH@A	r@Ai!J@A→%' @AMsgiK4@ACe∀@AISYSIKλAS]i<@Aio<Aica∃bd
∃
←eeK
iCEY∀@AC]⊂Ak]π=aeKGQCEYJ8@@A)!J@Ak9G←ee∃GiCE1JAKeI←ef@↓oSIXAEJA∃qaYC%]KH~)ISegβ!βO'v≠∃βSF+eβπ⊗)βO'oβ3↔Iph $)α↓απ9π+;∂?↔∪↔∂S∞∪3∃β-∪K/Iαβ'Mβ∞qβ↔K⊗{IβSFQ↓β≡WO↔~βS#∃ε+[π∪.S'?pβ'9↓¬;#'∂@β'P4Tp⊗≡∨↑.2π&tλ&*ε≤-w↔εX@D∧∃z→-d_;H∞≥X{tN8⎇_,-→(⊃.97q≠qqzi≤β λAi!JAM∪β∪@∨"∞MεNvt
FF∞AQ&F∞∞λ	-nh∩0→H:42P≤90w:~w3P'Yα anerro@HASKgMC@∨∃p∧α∧NβH∪mL~;k∧∞~→(↑\[tD∧≠94n≤9y(⎇y<c!∞≠h⊂~~2P:2\0
`∪]¬XAC]⊂AU←↓>C↔K∃∧+3O∃αCW;∪-≠EβO/βCK↔≥≠↔⊃@l\(→0→≤αset0AaCO∀@f@4α"αJB
mphVβ0=∞L<H∀≠{P⊂*~2P$WRβ  sWitchepεAC]⊂AeCe%CEIKL@ACE∀AgKh8∪∪@9∧s↔←'za↓βSF)βKπ⊗Kπ∪(h#/<|fNf↑4εO~⊂λ

<⎇⊂≠pε the fI@1KfAi<AgQR
PAKeI←dA≠∃`∂Oπ>+@~π=
w.fDλLTλ≤[n↑→1≥↓ phiL~∃@'vKS'πd¬GJε_4ε@.αyz phe Ter`≠∩αsπ1→ααS#∃∧+@↔⊗βp	 h@↔∂≤↔*λ0≠mnz0	J≤β of pπ←[J↓KqaYα;πS|ε'HhαP~2↑8∧ and  ⊃kMkCIYβI%βSF)β>-(	,≡λ≠`→λ30∂@e4AaQCPAGC↓(ε6.λ≥~T→<\M}KC"A↓@
   A`
@S,ε"πεTε/⊗∧[p→λ⊂6b@3pπCOJ↓QC@M∧∧&.8π⊂0p¬S@;&+⊃1↓∧6}vL∧[mD~0	P≤αed@*β∪;↔⊂εF`4λ≥~T≠;`→]¬∃↓⊗+∂.β]α,↑X[p→qp`∀cheb∞λThere  i@&AC@9∧∧W.Xπ`25CCiGαC↔I↓∧QβS⎇↓↓β3,εf.bβ⊂⊂_w2⊂$p¬e@>α !QXx=<∧2y9H0y2P≤β`H↓∧εWαε)∀π&FTλ	N↓u1z4[w⊂"@2p¬gKhα↓#πh	⊂_92puK⊂;t4Xt⊂:`3es eI`O↔ ¬α@$λ⊂;
@α@
@lαC'π⊗c∃↓β⊗K;∪'v;@~ε,X
∞|9;@⊂λ842Pλ2y ∩op-catcher↓C]H@↓iQJAA←SMhAgQJβ∪∃↓β&C∃β↔↔∪?HQ L<⎇<\L\λ_<LT≤Y<nMβy2b∧j4:\β all rabiabdeS are pestop¬KH@β#=βSF)βKπe+↔M↓∧εFF/∀	ε∞Q(↔"πMx∧
α2{"Z⊂7q_z⊂:4→P:4fYP:42H2y19Yz⊂;p\P27w→V⊂:w≠2yyP≥42|P≥ry2Pλ9rz8Irr⊂#≤2rFE
9tz4≠zz⊂ "eifG↓E←k]⊂R\
∀4∀@@A]QCh@↓QCaa∃]fA]∃q`⊃↓ε#↔C↔v#Mβ?r↓β#?:βS#∃αβ↔KK␈⊃7∂π&≠#↔I¬;πM↓π≠↔Qβ/↓8%α∂!βS?h+3↔6+11β&C∃β≠␈∪7Mβ}qβS#*β↔KKfKGQβ∂∪∃β↔63Wπ&+⊃βπv!βS#*βS/Aεc↔[↔bβ3??α↓#?Iε	βWO/⊂4+Oε+∂'≠L+⊃↓β&{Aβ3/3↔1↓ε3?K5Jβ'L'⊗)7↔;&+K↔⊃r↓↓"SF)↓βONk?1ε+KK3O≠Q↓βO→β↔[∞cWπS. 4+C⊗K?Iβ&yβS#*βπ?6)↓βK/≠S?K∂#'?9ε{→βNs∪';?→1βπv!↓βO∂3↔⊃βNqβS#*β[πKN3∃α↓=9↓∧K84+&C'Mβ>eβSF)β↔K⊗c'OQπ+O↔⊃εKMβSF)β?;*β∂WK⊗+;Qβ∂!βS#*βS'7*β?→β&C∃↓β/∪K?Ibβ∪↔OεKS∀4W##∃β⊗+OS?⊗S'?rβ?→β⊗K;∪'v;M9%∧K→βπrβ↔KK␈⊃βK↔'+K;Mπ#=β⊗+π-1εKQβONkC3eπ∪∃7↔w#↔KLhS'SMπ∪↔π⊃n+[π1oβK';"β3??αq↓↓αNqβS#*α7W3&K∂M↓εK7C3.k↔;S∂#'?9π##∃β6∂Q↓π##πQε∪K↔πXh+#π~β∂πW>CQβπrβ↔KK␈⊃↓β'~βO'∨v33↔"βeβ⊗K;∨'v9βS#*↓β↔faβ?9π##∃β&+K7'v19↓αα'→β∞p4+↔↔∪?Iβ⊗+SWKw→↓βSzβ↔KK≡+Q1β/∪KO↔"↓βK↔'+K;Mεs'1β∞s⊃↓β/3π3W∂#'?9πβK?∂.+∪M9α↓α'→ε84+/∪K?Iπ∪↔SW⊗sMβSzβS?Aεc↔[↔baβS#*βOSπ&)β?→π##∃β>{K3⊃εKMβK/≠↔Qβ∞s⊃↓)εKMβSOβ↔⊃8hP4)↓ααS#∀N?[*β∪↔O∨∪'CSN{9↓βO→↓βOfK∨#SgIβO'oβ3'≠N+⊃9↓ααS#∃π+O↔HN≠π9↓π∪↔GW/≠Qβπph+';&+KKWπ!βS=αβ?∂∂/⊃β↔';↔↔9αβS#∃π#gC'v9β?→αβS#∃εk↔OO∞;∃1↓ε;⊃β&C∃↓β.s←';&K;≥β}04+Ns∪';?→βπ;"βK↔S/∪9β?2β∂?;'∪?1β&y↓βπrβ↔KK␈⊃7∂π&≠#↔Ir↓α'→π##∃β/∪K?IεKM↓β>{';≥π#<4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓↓M~iE9PHH%↓↓α↓↓↓αε∨∃↓~iET4P0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4+K/#WK9π#=↓β&{Aβ3/3↔11π##∃↓αSKO↔"kSKπαβWO↔∩β';S/∪KWC"↓β'Mπ≠'∨;∞c3↔⊃r↓↓αSFKMβW≡+H4+NsS↔K↔+CQβO→β';O#'π3gH'¬β∨KOS↔jkOWCεc'↔⊃ε∪K↔πZβ3??α↓β←#N≠!βπfc?←Mπ##∀'/≠↔Iβ&x4+↔F7'≠*βS#∃π3π3W/→↓β?2β[πKN3↔~β↔≠␈∪∃βSF)↓βNs∪';?→βπK*βK↔O&{K↔⊃bβ'8'F{C∃β}04+≠Ns∪';:βS#∃ε≠πWO*β?→β&C∃β↔↔∪?I9αα'9↓BSKO↔"βQ%βn{∪∃β
βK↔∞Yβ3?␈↓β'Mε+;S↔⊗+⊃1β↔+P4+Nq↓!+↔≠↔QβvK1%βn{∪∃↓π##∃β/≠↔IβNsS↔K↔+CQβO→β'∨v{K↔⊃r↓↓α'2βS#∃ε+KK?∩β'M↓ε;?';:βS<4W∪↔SW⊗qβS=ε	βK.-β?∩βπ9β/∪KO↔"aβπ;"↓+KO/!β'Mεs?97vK11β&C∃β↔↔∪O↔Qπ+O↔IεK;S↔↔∪WCPhS'M↓π≠'∨;∞c3↔⊃pIαS#*↓β';O#'π1αβ↔;[O∪?;7.sQβ∂}sSπ'w→↓β∧NsW31αβ#π;&c↔I↓ε3?Iβ&C'L4VK;S↔↔∪WCQbβWQπ##∃β/≠↔IβneβO/βC3eε	βK.-β3}{Aβ?∩β?S#/⊃β#πv#3↔Iph(4)α↓α∂?↔∪↔∂S∞∪3∃β/∪K?K~βπK∃ε+KK?↔→↓β←FK∂!βneβ*β∂?K⊗+∂S↔"βe↓π+O↔IεK;S↔↔3↔;SN{984TK→βO.≠!βπrβ↔KK␈⊃β'MπβK?C/∪3eβ≡{KK↔∨#↔⊃1ε+[π3.S'?rβ←'3bβCK?≡+↔⊃β∂→β'→αβ;=β/∪K?HhS#π⊃ε{∂∂W↔∪↔⊃9αα'→β&C∃β?π#'?9π#=↓β≡{KK↔∨!βS#*β↔KK␈⊃β'Mεs?Qβ/C↔K∂O≠↔⊃1αβS#'~βSgC(h+?→ε+KK?∩β←'3bβ∃βF;∪3.!βπMεK→β'"β←↔K*βπ9β.s∂?K⊗+∂Sπ⊗c∃β↔↔∪?I8hP4)↓αα←#↔rβ¬β∂␈∪K↔∂&3∃ε+KK?∩β?∂∂/∪M1β
βWO↔∩β';S/∪KWC"β'Mβ≡K∨;πfc↔⊃9ααO↔∃πβπ∨∃β→44)I↓β≠␈⊃↓βW≡+Iβ'w#↔KK/βQ↓β≡Cπ;;.a↓βπ∨≠'∨;n+;SMε3?I↓π##↔O*↓β↔K⊗{KM9α↓αS#*β';'&Kπ04V+;['⊗{;7↔w!β∂?w#π';~↓β#πv#3↔K~β≠?IαβS#↔≡)β↔K⊗{KMβ>C'∂ OβK';"βπ9↓ε+KK?∩β7↔O≡∨∀4W≠'7'fIβSz↓βS#*β7↔O≡∨∃↓πβK';&+⊃β≠␈⊃βπ9cribing the error.	See section 1.4.2 for  details.  If the  user interrupt
handler  is nil,  or if  it  returns a	non-list, the  error is  treated  as an
uncorrectable error.  But if the  handler returns a list, the first  element of
that list is used to correct the error in a way which depends on the particular
error which occurred.

   If the most recent  error-catcher is not top-level, correctable  errors will
be treated as uncorrectable errors  unless there is a non-null handler	for the
errset interrupt.  This is to prevent confusing "multiply nested"  error breaks
unless the user indicates that he is sophisticated by setting up a  handler for
the errset interrupt.  (The errset  handler itself is only invoked if  *rset is
non-nil, however.)

   See the functions error, err, and errset.


1.4.2  User Interrupts


   LISP provides a number of "user interrupts," which are a mechanism  by which
a user	procedure may  temporarily gain control  when an  exceptional condition


Page 3-16			   ∪3-1.4.1			   March 3, 1979
				  The System


happens.  The exceptional conditions that use the user interrupt system include
certain control characters, the alarmclock timers, asynchronous I/O conditions,
the  garbage  collector,  and many  of	the  errors that  are  detected  by the
interpreter or by the system functions.  Errors detected by user  functions can
use this mechanism also.

   The user interrupts are divided up into several channels.  Each  channel has
associated  with  it a	service  function.   If the  service  function	is nil,
interrupts on  that channel will  be ignored.  If  the service function  is not
nil, it is a function which is called with one argument when the user-interrupt
occurs.   (A few  interrupt  handlers take  more  than one  argument.	See the
specific descriptions.) The nature of the argument depends on which channel the
interrupt is on; usually  it is an S-expression  which can be used  to localize
the cause of the interrupt.  Some user interrupts use the value returned by the
service function to decide what to do about the cause of the interrupt.

   Interrupts  can be  either synchronous  (e.g. errors  and  garbage collector
interrupts) or asynchronous (control characters, alarmclock, etc.).  To prevent
timing errors, asynchronous interrupts are always run in (nointerrupt  t) mode.
A handler for an asynchronous interrupt must explicitly do (nointerrupt nil) to
permit other asynchronous  errors to interrupt	it.  (For example,  the system-
supplied ↑b handler does this so that control character interrupts can	be used
within the ↑b break loop.)

   The service	functions for most  user interrupts are  kept as the  values of
symbols with  mnemonic names.	A list of  these symbols  begins on  page 3-19.
There are also user  interrupts for control characters.  The  service functions
for these are declared using (sstatus ttyint).	See page 3-78.

   The initial values for the  service functions of the various  interrupts are
provided by the system	as break loops for  some interrupts and nil  for others
(except for some control characters).

   There  are  some special  considerations  for user  interrupts  signalled by
correctable  error  conditions.  The  argument	to the	service  function  is a
description of the error whose exact form is described in the catalogue  at the
end of this section.  If the service function returns nil (or any  other atom),
the normal error procedure occurs -- control returns to the most recent errset,
or to  top level if  there was no  errset.  If the  service function  returns a
list, the first element of the list is used to attempt recovery from the error.
The exact way that  it is used is described  in the catalogue.	If  recovery is
successful  execution proceeds	from the  point where  the error  occurred.  If
recovery is unsuccessful another error is signalled.

March 3, 1979			   ∪3-1.4.2			       Page 3-17
			   Maclisp Reference Manual


   Here is an example  of a user interrupt  service function.  This is	the one
supplied  by the  system for  unbound variable	errors when  the user  does not
specify   one.	 Note	that  the   system-supplied  error   service  functions
consistently bind args to the argument supplied.  The user can check  the value
of this variable to see what is wrong.	Note too that the system-supplied error
handlers restore readtable and obarray before breaking.

      (defun +internal-ubv-break (args)
	     (declare (special args))
	     (errprint nil msgfileq)	     ;print error message
	     ((lAmbda (readtable kbarray)
		      (nointerrupt nil)
		      (breac unbnd-vrbd))
	      (get 'readtable 'array)
	      (get 'obarray 'array)))
      (setq unbnd-vrbl '+interjal-ubv-break)
¬

adarmcloci	    SUBR 2 args

	alarmclock is a function fo@HAG←]QeGYY%]NAi%[Cef8@A∪h↓GC\AMiCeh↓C]HAMi←`~(@@@@↓ig↑AMKaCE¬iJ@AQS[KeLvA←]∀ASf@↓BAeK¬X[iS5JAiS5Kd@@!oQSG AG←k9if@AMKG←]⊃fA←L4∀@@@AKYCAgKHAQS[JR↓C]HAQQJA←QQKdA%bABA
aj[i%[BAi%[Cd@!oQSG AG←k9ifA[%Ge←g∃G←]IL~∀@@@A←L↓[CGQ%]JAeU\@Ai%[JR\A)QJ↓MSegP∪CeOU[K]h↓i↑AC1Ce[G1←GV∪%]ISG¬iKfA]QSGP4∀@@@AiS[∃dASf↓EKS]≤AeKM∃eeKH↓i↑t@↓ShA[¬rAEJ↓iQJA¬i←ZAQS[JAQ↑AS]⊃SGCi∀AiQJ↓eKCX4~∀@@@AiS5JAiS5KdA←HAiQJ↓Ci←Z↓ek]i%[JAi<AS]I%GCiJ↓iQJA
aj[i%[JAi%[Kd\4∀~∀∪QQJAg∃G←]H↓CeOk5K]hAQ↑ACY¬e[GY=GVAG=]ie←1fAoQ¬hASf↓I←]J↓iVAi!JAgK1KGiK⊂~∀@@@AiS5Kd\@↓∪L@A%hASf↓B@A]=\[]K≥CiSm∀A]k[	Kd@Q→Sq]k4@A←d↓MY←]UZRAi!J@Ai%[KdA%f~∀@@@AgQCeiK⊂\@A)!kfAS_A\ASLABAa=gSiSYJAMSa]kZA=`AMY=]kZX↓KmCYUCiS]≤@QCY¬e[GY=GV~∀@@@@≥iS[J↓\RAg∃ifAi!JAeK¬X[iS5JAiS5KdAi<AO↑A=MLARαqβ9β≡+∂?;'→0'πv!↓#πfK7∂f{∂,4R↓↓↓↓α;KWnM⊗n*
a∩π≡↑N2π&Tε∨πU↑FNnT
FNn↑ απ&tvzε|hbεNd
bεn≤>&␈≡X8ml≤kB$	9H≥
#"H∧∧λλ∃
≥9<H∞|<h_-NY89∂∀≤Y0↔≠4p∞g↓iQJA=QHAg∃i`∪'v9β'Mεc?OQp∧α¬&∞↑2ε∂Dλλ-o(⊃z.l;H∃
≥9#"D∧λλλ\8z∞M990→λ1pw≠w6<P_2P9:[54w3H⊂37@2 one alabm, buPAiQJ↓ag↑AQS[KeL∪GC\↓`G8hQ↓↓↓αβGπ↔.cCπlXn↑{≡+AQ@εE∧∩pε the	se@
←]HA¬aOk[∃]`@Aβ#=βπdKπ∂d¬v≡X≥≡2ε@Yqα,∀≤≠tm≡~=Y$∧≠];,,<Kλ∞M→#"D∧λλλ∞M990→λ4yP)Z8z /d¬LX@)	or (alarmclock p -1)  shuts off
     the x timer.

	alarmclock returns t if it Starts a timar, nil if it shuts it Off.



Page 3-18			   ∪3-1.4.2			   March 3, 1979
				  The System


	When  a timer  goes  off, the  alarmclock user	interrupt  occurs.  The
     service function is  run in (nointerrupt  t) mode so  that it will  not be
     interrupted while	it is  performing its  service.  If  it wants  to allow
     interrupts, other timers, etc. it can evaluate (nointerrupt nil).	 In any
     case the status of the nointerrupt flag will be restored when  the service
     function  returns.   The argument	passed	to the	user  interrupt service
     function is the  atom time or the	atom runtime, depending on  which timer
     went off.	See also the function nointerrupt.


nointerrupt	    SUBR 1 arg

	(nointerrupt t)  shuts off LISP  interrupts.  This  prevents alarmclock
     timers from going off and	prevents the use of control characters	such as
     CTRL/g and CTRL/b.  Any of  these interrupts that occur are  simply saved.
     (nointerrupt t) mode is used to protect critical code in  large subsystems
     written in LISP.  A similar deferral technique is used by the  LISP system
     itself to protect against interrupts in the garbage collector.

	(nointerrupt 'tty) prevents control characters (typed on  the terminal,
     or  "tty") from  causing interrupts;  however, alarmclock	interrupts (and
     other   asynchronous   interrupts)  are   still   allowed.    Any	non-tty
     asynchronous interrupts which were saved will now go off.

	(nointerrupt nil) turns interrupts back on.  Any interrupts  which were
     saved will now get processed.  This is the normal, initial state.

	The result returned from nointerrupt is the previous interrupt status -
     nil, t, or tty.

	Example:

	   ((lambda (oldstatus)
		    <protected code>
		    (nointerrupt oldstatus))
	    (nointerrupt t))



1.4.3  Catalogue of User Interrupt Channels




March 3, 1979			   ∪3-1.4.2			       Page 3-19
			   Maclisp Reference Manual


   Each  user  interrupt channel  (except  some associated  with  files)  has a
variable  whose value  is  a functional  form,	the service  function  for that
channel.  The  name of the  interrupt channel is  the same as  the name  of the
variable.   The following  lists the  user interrupt  channels	in alphabetical
order.	The  argument to which	the service function  is applied and  the value
which  it  should return  are  described.  By  convention,  almost  all service
functions receive one  argument.  Some user interrupts	are initially set  to a
system-supplied  handler which	binds the  variable args  to this  argument and
enters a break loop.  The name of the interrupt is used as the break identifer.

   Some  user interrupts  ignore the  value returned  by the  service function,
while  others distinguish  two	cases.	If  the  value is  atomic,  the service
function was not able to recover from the condition that caused  the interrupt.
LISP will take its default action, such as returning control to the most recent
errset.  If the value is a list,  the car of that list is used to  recover from
the condition that caused the interrupt.  It is usually a new piece of	data to
be used in place of the one  that was being complAined about, or a new	form to
be evaluated in place of the form that erred.

   If the value of the service-function variable is nil instead of a functional
form, the user interrupt is considered to be turned off.  The system behaves as
if the function had run and returned nil.

   Some  user  interrupts  are	asynchronous in  nature,  and  are  executed in
(nointerrupt  t) mode  to  prevent timing  errors.  The  interrupt  handler may
choose to  run in (nointerrupt	nil) mode, however,  as the initial  ↑b handler
does.	The  nointerrupt mode  is  restored  after the	handler  is  run.  Such
interrupts are themselves deferred by (nointerrupt t) mode.

alarmclock	    VARIABLE

The  value  of	alarmclock  is the  service  function  for  the  user interrupt
signalled  when  a timer  set  up by  the  alarmclock function	goes  off.  The
argument  is the  name	of the	timer which  went  off, time  or  runtime.  The
returned value is ignored.  The service function is executed in (nointerrupt t)
mode.  This interrupt is initially turned off,


autoload	    VARIABLE

The value  of autolkad	is the service	fqnction for  the user	interrupt which
provides  automatic  loading of  program  paciages into  the  environment.A)QJ4∀~∀~)!COJfZd`$∩∩@@&fZb8h\f∩$∩@@A5CeGPfX@bdnr~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∃CIOk[K9h@ASL@@QMU]GiS=\[]C5J@@\ACki=YP∨π"kCK?+CCeJq↓↓α&C∃↓β⊗+SGKv+⊃↓β63G∃αβ'L4TK∨;?⊗+⊃9↓¬≠↔∃↓πβπ∂∃β→5IYαβ∪∂I∧∧F/&≥≥G
P~MεO~∧
⊗w&↑.'/πD	↔4λ~;M≡~8;
N(≤q.Dλ≥≠d!"P∪≥w1z4[w⊂;t~qt⊂9Zvx6 9 loads a @→SYJ\4∀∩∧~)GYR[5KggC≥J∩@@A-β%%β¬→
4⊂~¬)!JAmC1k@∃β|1β∂3Jk7π∂≡∨¬β≡+CKπ≡)β#πv#3↔I∧3?Iβ&C∃βW≤+Aβ'w#↔KK/βQ↓β≡K⊂≡v≥MF."∞⎇ε.pQ(⊗v␈MWαε-|"εF≡4εNwLZ'↔∂∞LV"πMR∧d~:ααε-|"π6≤∀π&FTλ4dJLW6N<Ubα¬MRαε≡,w.n]nBεO1Q&vNDλλ-lλ≥~T≤Y=∞↑[Y9∧∧≥X;∞\(~<d
9{[n,9H∧λ(≥<l↑Hλ~≥Y≠→.⊂4yP→|82q]2r⊂:≠P⊂7x→w⊂0FB34v2H7w⊂:~2P!f⊂P⊂22]4qrP_w2⊂9→pr⊂:~2P6r\ypsrH⊂397[P:42H7z42\⊂57q⊂⊂⊂*~2P9r\;4qrCE3:w_z4wwλ4yP9≥w⊂⊂4[⊂∀77Zw:2y≤:x:⊂≥∀P6wY2W⊂⊂λ*44yH4w:2\9:x:λ4yP⊂~w4z4Xv6<P≥:y72YεE7s→↔⊂⊂!]y92w≥6<V⊂~z⊂2|~yz9P≠w6<P~w⊂:4→P$j)H'2{t[P4vx≠2vrw≥0z4w[↔εEεB	    VARIABLE

The value of  errset is the  service function for  the user interrupt  which is
signalled when	an error  is caught  by an  errset and	*rset is  non-nil.  The
argument is  nil and  the returned value  is ignored.	This user  interrupt is
initially off.	 Turning it on	affects the behavior  of the error  system (see
page 3-16).


fail-act	    VARIABLE

The value of fail-act is the  service function for the user interrupt  which is
signalled when any of a large variety of miscellaneous error conditions occurs.
The  argument  is  a list  whose  first  element is  generally	a  symbol which
describes the type of error  condition.  The rest of the list  contains various
objects related to the error.  The returned value depends on the  error.  These
are  not  standardized and  will  not  be described  here.   This  interrupt is
initially set to a break loop.


gc-daemon	    VARIABLE

The value of gc-daemon is the service function for the user interrupt  which is
signalled after each garbage collection.   The argument is a list of  items; in
the PDP-10   implementation each  item is of  the form	(space-name free-before
free-after size-before size-after) and in the Multics implementation, each item
is of the  form (space-name free-before .  free-after).  The returned  value is
ignored.  This interrupt is initially turned off.

March 3, 1979			   ∪3-1.4.3			       Page 3-21
			   Maclisp Reference Manual


gc-lossage	    VARIABLE

The value of gc-lossaga is the sarvice function foR the userinterrqpt which is
sagnalled when there  iS no  more  available address  space or  when the Time
λSharing  Monitor  rejectq   a  requast	fkr   more  meMory.  In   the	MulTics
impl@∃[C@;&S'?paβS#/∪∃↓βO→βπ3>gM↓ε+;/W>Aβ7↔n{Ce1¬≠=↓β&C'Mβ/≠↔H'NsS↔K↔+CQβv+[↔HhS?∂∂/∪E9↓∧K9↓β&C∃αB%↓5EAεK7C3.k↔;S∂#'?8O##∃β∂∪∨W7,sQβ'~↓βS#*β;π7*β?→↓π##∃β∨βπ∂∀hSS#π β3?O"aβπ;"βS#∃π∪↔SW⊗s↔⊃β63W∃εKEβ'>s?K↔ q↓αSFKMβ'w#↔KK/βQβ'~↓β';O#'π3gIβO↔ h+S=ε	βK.-β3}{A84Ph(4+>→7?[/∪≠3?8I↓↓↓¬2εJ&∩2∀4Ph*S#*β[π3.)β?→ε;
7?6+K≠3␈9β'MαβS#∃π≠↔K[N≠∃β≠.s∂S'}qβ≠?∩βS#∃π+O↔HNK;S↔↔∪WCQπ;#'∂@h+'Mπ≠'∨;∞c3↔⊃π;#↔9ε	βOC∞≠∃β?6+K≠3␈;Mβ''→β∨∂na8%G≠↔∃β∞c3/
ε;⊃↓G≠SπS,ε2ε>=\↔BJe⊃PU&Tε∂⊗}]V.wD	↔
πMRαεl≥V*ε|dπ&FT∞7ε∞<Ubαα
Mε*π,↑G/⊗l\Bπ6≥NV*ε≡4αεN⎇mw⊗.Edα¬&
≡0hV≥nF/↔.↑π"ε≡4εNv≡M⊗∞fO∀π≡/D∞Fzε∀'⊗.≥4εf}}¬`hPQ!PVNu]F␈∨<≤v(J∧∧α¬4~)∀∀HQPPh*Mε*πl≥G.*
|bεNu]F␈∨<≤v*ε≡4π&FT∞6/↔m≤6*εn]f∨&≥⎇bε6}$π&FT∞W≡/$
⊗w&↑.'/πD∞vFN=∧εO_Q.6N>l≥Ff.D∞vF.d∞FF*∧	∩|z∞?↔∨&]Pε.v=}Vw&↑.2ε∞d∧ε/↔-}"αFm}"ε/≥WεfUDε
αm⊗f*∞⎇εN≡↓Q'>∂4&.Nltε␈ε]lV"α∞|↔~εm}Bε6}]f"Jd∧¬&FQ≤↔⊗?]\Vw"
≡2ε

M↔∨"∧
v2πMRεv≥\Rαε|dπ&FQQ&7∞l>FN}d∞vFN=↓⊗/↔,\Bε∞lDεO'4∧ε∂⊗}]V.wN5Bπ>
≤6Bε\∨∩αε≡f*ε,\VpO>L⊗v&≡,FOV\Dε␈⊂Q-w&F↑.vO≡T∞ε∂↔M≤⊗fg∀FN>↑>F."d∧¬&FT∞&/'↑-f."∞l⊗g.T
↔~ε∀
FO∨D
v2ε∀
f/:mw⊗j∞Mrε⊗QQ&/6≥NV∂&\DεNr∞
F∞≡T
v2πMRε≡≥MBπ&t∞FF*nVv∨M≥vrπ⎇
⊗≡B↑'⊗.Edα¬&
≡2αε≥nF/↔.↑π"ε≡1PVNm≡FN∞MO∩π≡↑Dπ&z∀ε↔⊗\≥2εf⎇}αph!Q hV\≤6FNlUV/↔-} Jα∧∧¬4
)_∀∀dQQ hUMRαπl≥G.*
|bαε\≤6FNlUV/↔-}"αε≡4π&FT∧π≡/.m⊗≡*∧
ε∞vMLW∩εm}"απMRαπ↑<W∩ε≥nF/↔.↑π h.=⊗>v≥MF."∞⎇ε.r∞=vn*M⊗66≤>Vg'∀
↔~ε←∞ε/⊗≤]f≡.D'JπMRεF}>Bεn≤=εNvUdα¬&Tπ≡/.m⊗≡(Q,g.v>M⊗}r∞,V≡.≡lW~εm}W∩ε≡,w.n]nG~ε≥n7&.≤Dε}2
⎇f*r∧
FF*m↔↔∨D
↔~ε≥dε∂&⎇]⊗~π?≥V⊗}AQ&NvM≤6∂&≥lrπ&Tπ'OTε}2↑'⊗␈'!PPh$∧αε/l≥@HJ∧∧αεNMLV>∞D
V∞≡
≥f*ε}W⊗∂M≥vph$∧αε/≥VNvQ∀ααα≡G&.↑∞Bπ&t∞&.6↑,Vv≡T
f}r\←εO∨L]g"ε\]V␈↔⊃Q"ααLWε␈=≡@Jα∧∧ε∂'L]Wπ"∞Mrπ?-≡F*ε≥nFzπ,\⊗"n⎇mGJε\]V␈↔⊃Q"αα
|F'⊃∀ααα∞↔⊗OO∀ε/↔-} hUMRε␈MW∩πM∞&.*≡&?.\]g'~≡&*εm∨εw.↑4π>F≤=αε∂,Tε∞εN,W∨≡↑4ε}2∧
V.n}/∩εf|<↔&N⎇n2ph!Q hU≤v*β5V#⊂H⊃∀αα↓65S
sEf0HH∀∧α∧n≡,6Bβ5DβKw⊃PP`H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh*Mε*π<\6}vD
↔~πMRεf|<↔&N⎇dε}2∞Mε*ε↑.&␈∪4∞FF*∞MεO⊗D
↔~πMRππ-|w⊗∞T∧ε≡␈]nF/∩∞⎇ε.pQ.FF*↑'⊗␈$
v≡∨↑.&.#4⊗v"∧∞FF*mw/↔M∧εO~∞Mε*∧*λ0JGMRππ-|w⊗∞T6␈.nLW∩ε≡4αε}d∞FF(Q-F∂∨D
'.o∧∧εNw>N'.∨M≥vrε,\f␈⊗T∞FF*∧W↔⊗}$ε}≡>↑'⊗.E∃bα¬MRαε\≤6FNlUV/↔-}"εF≥lFf/!Q&n∂∀∞6N>l≥Bαε∀FN6l↑&.wD
6NvD∧ε}2↑'⊗␈$
w∩α∀¬v:∞≡VO"∧¬π≡.T∞FF*lrαεn]f∨&≥⎇bJε≤aPV&↑=↔⊗.EDε␈∩∧Vw&↑$ε
ε.,V∞Z∧
F}␈¬dα¬&Q↔∨..$ε7.l>FN}d¬π≡.T∧πε∞|Tβ~k⊗ε∩Jα
\↔Jε,QPW/<\g.b
≥bαεL\6}&≥lrπ&Tπ&G,\Rαεm∨εw.T↔⊗?]\Vw'5dα∧Nd∧π&FT
ε∞vMLW∩α∞,W'/-n2bπMPhWl≥G.*
≡2εN⎇mw⊗.D⊗v"∞Mε*ε↑.&}v]}W~ε}W⊗∂M≥vrε≡4π⊗/N-⊗."d∧∧N2∞Mε*α∞↑6/∩∞∞&␈6≤LW_h-mrεn≤=εNvU\W↔⊗}$εF∞lMF/∩¬∞FF*
≥g&/..Wπ"
≡2εNm≡FN∞MO∩π'↑-f."
|f2JD∞FF*∧W↔⊗}$εO_Q-ε∞vMLV"ε≥dπ&FTF.6≡]G"ε\≥fv/$f␈∩∞Mε*ε
}7"ε\≤6FNlUbα∧⎇d∧M%5Dπ&F≡4ππ/N4π&FT∞W≡/!Q&NrλHE"r∧
FFO47/↔,]g&g∀WFO>N2ε}mO∩εNd∞FF*
λEαk⊗∧∧v/⎇≥rεN↑
F.n]nF∂&≥⎇bph(←ε∞o
LSPh!Q"αα¬F.7]dεn∞=
⊗v*\↑'⊗␈%]ε∞vMLW∩α∞O↔ε*
Mv~π4εWε5⊃PPJ∧¬αFf≥\&&
¬↔⊗?4∞F/↔∞-∩Hh!⊃∩αα¬F.≡L≡&*α∞>ε.≡≤≥Bε∂,}2π&↑.π⊗J∃⊃PPH∀∧ααGL↑'π⊗∀
W≡>m≥F/~⊃Q HJ∧∧αF≡⎇lBαB↑∩π'≡Rα>←⊗nNlU⊂hP⊃⊃∩αα∞∞&Nv4∧wc](Xd-∀Yh4*¬It∧t|eXUDM:HTu Q!⊂HH∀	T,lz+↔bε↑<v6NL↑2JHQ!⊂HJ¬¬ε/
∞O↔ε*∧|F/ε}=↔"HQ!⊂HJ∧¬ππ⊗≥l2α?G:u∀MHT∧LuIt¬∀,_ET|tK∀∧l,Yz%O`Q!⊂HH∀
W≡>m≥F/~∃⊃PPH⊃∀αBF↑∀π'OTα>/l≥BHh!⊃⊂Jα¬∞π⊗Nl4α?c9→Dd,x→B∧l_9∧LtT	u∧-(~DL|oAPPH⊃⊃∩εo<|fNf↑5∩Hh!⊃⊂Jα¬W
πO≡ε*α⎇|F'α⊃Q HH∀∧αGπ-≥f~α␈G4l,Yz%J¬λ~$M%∀λU∃∀z/@hP⊃⊃⊂Jε↑<v6NL↑2JHQ!⊂HJ¬∞BαG∞-⊗v~∧␈C],i9d⎇<d	T≤	→d*∧Z*$⎇↔AQ HH⊃∀ααε↑<v6NL↑2JJ⊃Q HJ∧∧αGπ-≥f~α␈D∧5∀yT∧d|8~DL|d∂Bεo<|fNf↑5⊂hP⊃∀ααα∞∞&Nv4∞ε~HQ!⊂Jα∧¬ππ⊗≥l2α?D	∀r∧jYd≥$→ybπb
↑6>6≥LW~HQ!⊂Jα∧¬ππ⊗≥f∩αG>\'∩π5∩Hh!⊃∩αα¬'⊗.≥4εn∞=
⊗v*\↑'⊗␈%∃⊂hP∀∧ααFM≡7"πO≡ε*εM|2πε4
'ε~⊃Q Jα∧∞BJHQ!PPh-\↔∩n.,V∞X∀∧αα¬h~$L)HPhPQ*FF*∞l⊗g.T
v2ε\≡"n↔,\⊗Zε≡4π&FT∞6/↔m≤6*ε≥f&f↑$ε6␈$∞FF*∞↑6/∩∧
⊗w&↑.'/πD∞6N>l≥Ff.AQ hPQ)V∂⊗=∧β~bε↔∪;H⊃⊃∩ααα62k
fEc_H⊃∀ααα∧∧α¬ε≤|Rβ~V&0hP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hW⎇VrπMRεn]]w↔J∧
F}≡≡M⊗}r∞>ε.≡≤m⊗."/∩αG>>F∂' mar) (see page 3-95)  has been
accessed in the specified manner.   The argument is nil and the  returned value
is ignored.  The service function  is run in (nointerrupt t) mode.   Also, LISP
implicitly performs (sstatus mar 0 nil) before running the user interrupt; this
helps to prevent infinite loops.   This interrupt is initially turned  off.  It
currently exists only in the  ITS Newio implementation. See page 3-55  for more
information on using this interrupt.


pdl-overflow	    VARIABLE

The value of pdl-overflow is the service function for the user	interrupt which
is signalled when a pushdown  list exceeds its pdlmax.	(see alloc  and (status
pdlmax).) The  argument is the	spacename of the  pushdown list.   The returned
value is ignored.  This interrupt is iniTially set to abreak loop.


sys-death	    VARIABLE

The value of sys-death is the service handler for the user  interrupt signalled
when the time-sharing system  is about to go  down, has been revived  from that
state, or is  being debugged.  The  argument is nil  and the returned  value is
ignored.  A  user handler may  wish to	examine the result  of (status	its) to
determife the state of the system.  The service function is run in (nointerrupt
t) Mode.  This interrupt is  initially turned off.  This currently  exists only
an the ITS Newio implementation.


ttq-return	    VARIABLE

The value of tty-return is the service handler for the user interrupt signalled
when cOntrol of the terminal is retuRned to the LISP job by itq superior.  This
allows LISP to determine that the display screen may have been changedby other
jobs.  The  argument is  nil and the  returned value  iq ignored.   The service
function is run  in (nointerrupt t) mode.   This interrupt is  initially turned
off.  This currently exists only in the ITS Newio implementation.


unbnd-vrbl	    VARIABLE

The value of unbnd-vrbl is the service function for the user interrupt which is
signalled when an attempt is made  to evaluate an atomic symbol which  does not


Page 3-24			   ∪3-1.4.3			   March 3, 1979
				  The System


have a value (an unbound variable.) The argument is a list of the  symbol which
could not be  evaluated.  The returned value  is a list of  a new symbol  to be
evaluated in its place.  This interrupt is initially set to a break loop.


undf-fnctn	    VARIABLE

The value of undf-fnctn is the service function for the user interrupt which is
signalled when an attempt is made to apply an undefined function.  The argument
is a  list of the  functional form  which could not  be applied.   The returned
value is a list of a new functional form to take its place.  This  interrupt is
initially set to a break loop.


unseen-go-tag	    VARIABLE

The value of unseen-go-tag is the service function for the user interrupt which
is signalled when go or  throw is used with a  tag which does not exist  in the
current prog body or in any catch, respectively.  The argument is a list of the
erroneous tag.	The returned value is a list of a new tag to replace  it.  This
interrupt is initially set to a break loop.


wrng-no-args	    VARIABLE

The value of wrng-no-args is the service function for the user	interrupt which
is signalled when a function is called with the wrong number of arguments.  The
argument  is a	list  of two  items:  First, a	list  of the  function	and the
arguments  that  were passed.	Second,  the lambda-list  if  the  function was
interpreted,  or the  same dotted  pair  as args  returns if  the  function was
compiled,  or the  atom ?  if this  information could  not be  determined.  The
returned value is a list of a  new form to be evaluated in place of  the losing
one.  This interrupt is initially set to a break loop.


wrng-type-arg	    VARIABLE

The value of wrng-type-arg is the service function for the user interrupt which
is signalled  when an  argument is  passed to  a system  function which  is not
acceptable to that function.  The argument is a list of the argument  which was
not accepted.  The returned  value is a list of  a new argument to  replace it.
That is, directly an argument, not  a form to be evaluated to get  an argument.
This interrupt is initially set to a break loop.

March 3, 1979			   ∪3-1.4.3			       Page 3-25
			   Maclisp Reference Manual


*rset-trap	    VARIABLE

The value of *rset-trap is the service function for the user interrupt which is
signalled when an error returns control tk top level, just before  the bindings
are restored.	By convention,	the handler  for this  interrupt should  not do
anything unless the variable *rset is  non-nil.  This is so that the  user will
not be bothered unless he has put LISP in debugging mode.  The argument  is nil
afd  the retuRned  value is  ignored.	This interrupt	iq initially  set  to a
Function which enters a break loop id *rset is non-nil.

   There are other  interrupt handlers which are  associated with I/O  files or
inferior jobs.	See eoffn, endpagefn, (sstatus ttyint), and create-job.


1.4.4  Autoload


   The autoload feature provides the ability for a function not present  in the
environment to	be automatically loaded  in from  a file the  first time  it is
called.  When eval,  apply, funcall, or the  version of apply used  by compiled
LISP searches the property list  of an atom looking for a  functional property,
and fails to find  one, it looks for  a property under the  indicator autoload,
and it it finds one, automatic loading will occur.

   Automatic loading is performed by means of the autoload user interrupt; thus
the user may assert any desired  degree of control over it.  When  the autoload
property  is  encountered,  the  user  interrupt  handler  is  called  with one
argument, which is a  dotted pair whose car is	the atomic symbol which  is the
function  being  autoload'ed,  and  whose cdr  is  the	value  of  the autoload
property.  The system-supplied handler for this user interrupt could  have been
defined by:

      (setq autoload
	    (function (lambda (x) (load (cdr x)) )))

From this one  can see that  the value of the  autoload property should  be the
name of the file which contains the definition of the function.  Note:	 in the
TOPS-10  implementations the  system  autoload handler	presently  uses fasload
rather than load  because the load function  requires the Newio  feature.  This
affects the form of an autoload property.

   When the interrupt handler returns, it should have put a functional property


Page 3-26			   ∪3-1.4.3			   March 3, 1979
				  The System


on the property list of  the function being autoloaded.  If not,  an undf-fnctn
error will occur with a message such as "function undefined after autoload."

   Examples of setting up functions to be autoloaded:

   In the Multics implementation:

      (putprop 'foo ">udd>AutoProg>Library>foo-function" 'autoload)

   In the PDP-10 Oldio implementation:

      (putprop 'foo '(foo fasl dsk me) 'autoload)

   In the PDP-10 Newio implementation:

      (putprop 'foo '((dsk me) foo) 'autoload)

   or (putprop	'foo '|dsk:me;foo  fasl| 'autoload) or	the Oldio  version also
works.

























March 3, 1979			   ∪3-1.4.4			       Page 3-27
			   Maclisp Reference Manual


1.5  Debugging



1.5.1  Binding, Pdl Pointers, and the Evaluator


   The Maclisp evaluator is  based on a push  down list (pdl), or  stack, which
holds  bindings, evaluation  frames, and  sundry internal  data.   Bindings are
values of atomic symbols  which are saved when	the symbols are used  as lambda
variables, prog variables, or do variables.  Evaluation frames	are constructed
when a non-atomic form is evaluated or when apply is used.  They  correspond to
function calls.

   As the evaluator  recursively evaluates a  form, information is  pushed onto
the  pdl and  later popped  off.  When	the *rset  and nouuo  flags are  t this
information  is sufficiently  detailed to  be of  use in  debugging.   (See the
variables *rset and nouuo in the next section.)

   A position within the pdl may be named by means of a "pdl pointer", which is
a  negative fixnum  whose value  has  meaning to  the evaluator.   nil	is also
accepted as a pdl pointer; it means the top of the stack, i.e. the  most recent
evaluation.  Note that this is different from nil as a binding context pointer,
which means the  bottom of the	stack or the  outermost evaluation.  0	is also
accepted as a pdl pointer; it designates the frame at the bottom of  the stack.
Pdl pointers may be used as arguments to several debugging  functions described
in the next section.  Since the fixnum value of a pdl pointer has only internal
meaning, generally a pdl pointer cannot be obtained from user input,  except by
the user typing in a pdl pointer  chosen from a list of pdl pointers  typed out
at him.  The  "frame" functions described  in the next	section may be	used to
obtain pdl pointers.

   An important  thing to  note about pdl  pointers is	their limited  scope of
validity.  If the information  on the pdl which is  named by a pdl  pointer has
been popped off since  the pdl pointer was  created, the pdl pointer  no longer
has valid meaning.


1.5.2  Functions for Debugging





Page 3-28			    ∪3-1.5			   March 3, 1979
				  The System


*rset		    SUBR 1 arg

	(*rset x) sets the  *rset switch to nil  if x is nil,  or to t if  x is
     non-nil, and returns the value it set it to.  (See below).   This function
     exists primarily for user typing convenience.


*rset		    SWITCH

	If  the *rset  switch  is non-nil,  extra  information is  kept  by the
     interpreter  to  allow  the  debugging  functions,  such  as  baktrace and
     evalframe, to work.  In  addition, the interpreter will make  extra checks
     such as checking  the number of  arguments passed to  a subr or  lsubr and
     checking that array subscripts lie within the declared bounds.  Generally,
     the *bset switch being on means "I am debugging"; this is known  as "*rset
     mode".  The iniTial State of the switch iq nil.


nouuo		    SUBR 1arg

	(nouuo t) sets the nouuo switch∞

	(nguUo nil) tuRns off the nguuo switch. (This is the iNitial state.)

	nouuo Returns t or nil accOpding to whether it turned the  nouuo switch
     on or off,  (See below.)	This function exists primarily for  usep typing
     convenience.


nouuo		    SWITCH

	If the nouuo switch is on, function calls made by compiled functions to
     compiled  functions  or system  functions	are forced  to	go  through the
     interpreter each time.   This aids in debugging.	If the nouuo  switch is
     off, which is the normal case, compiled calls can be made to  go directly,
     which is much faster.

	The nouuo switch may be turned off at any time.  Each compiled function
     call will only go through the interpreter once more, at which time it will
     be  linked directly.   If the  compiled code  has been  reloaded  into the
     system with the PURE option (see  page 3-71) then this direct link  may be
     unsnapped and the Interpreter route re-established by  (sstatus uuolinks).


March 3, 1979			   ∪3-1.5.2			       Page 3-29
			   Maclisp Reference Manual


     Because the PURE option requires an amount of extra space and time,  it is
     not normally on; thus links  snapped in code loaded as non-PURE  cannot be
     unlinked.

	The trace package  turns this switch on  when a function is  traced, in
     order  to	ensure that  tracing  will work  even  for  compiled functions.
     Compiled function calls  which have been "snapped"  to go directly  do not
     push debugging information in *rset  mode and cannot be traced.   See also
     (status uuolinks).


baktrace	    LSUBR 0 to 2 args

	baktrace  displays  the  stack of  pending  function  calls.   It gives
     detailed information only in (*rset t) mode.  The first argument is  a pdl
     pointer, as with evalframe.  If it is omitted, nil is assumed, which means
     start from the top of the pdl.  The second argument is the  maximum number
     of lines  to be typed;  if it  is omitted the  entire stack  is displayed.
     (The  second  argument  is   currently  permitted	only  in   the	Multics
     implementation.)  The information printed	by baktrace is not the	same as
     that  obtained with  evalframe; both  should be  used to  get  the maximum
     amount of debugging information.


baklist		    LSUBR 0 to 1 arg

	baklist returns a list containing the information which  baktrace would
     print.  (This is available only on the PDP-10 implementations.)


errframe	    SUBR 1 arg

	errframe returns a list describing  an error which has been  stacked up
     because of a  user interrupt.  The list  has the form (err  pdlptr message
     bcp), where pdlptr is a number which describes the location in the  pdl of
     the error, message is a list  of from one to three things which,  given to
     the error function,  could have caused this  same error, and  bcp (binding
     context pointer) is  a number which  can be used  as a second  argument to
     eval or a third argument  to apply to cause evaluation using  the bindings
     in effect just before the error occurred.

	The argument to errframe can be  nil, which means to find the  error at


Page 3-30			   ∪3-1.5.2			   March 3, 1979
				  The System

	α     the top of The  stack: i.e. the most p¬KGK9h@AKIaGd\A∪hA
C\AC1g↑AE∀@AB@AIX~∀@@@AA←S]i∃dXAS8AoQS
PAGCMJAiQ∀@Agi¬GVASLAgKCIGQKHαβ∪?←w;πK⊃ε3C/5αβS#∃∧K;∪'≡S↔⊂hQ↓↓↓αβC?OM#'?9pJS#W~↓β'→¬##↔K*βπK∃αβK↔∂-∪@≡OlTε≡∞MJ2π&q~FF*PN5y⊂⊂~0p∞dler, @QQJ
∀@@@AMKG←]⊂AKee=dAEC
RAI←β;9βSF)βOS∞≠%β7∂Iβ∃∧3?W≠ ∧ε↔K!Q h⊂α"(∧∧λλλ∧¬→<\LNX;9$¬_x9∞⊂⊂2@2pframe nI0RRR~(~(~Mε*ε_Yn]9;]∧∞≠hλ↑\YTL≥9(∪,∨(⊂;∞wP12H⊂0P0ositive number shi
P@ASLAaQJ4⊂@@@AUKO¬iSmJ↓←D@A∧AaIXAa←S9iKd\α↓αS#M→β.\≥g4λ≤p~_y0∀@→`}T∧π&FT
ε␈≡≤M⊗}r∧λ
-d≥~→!PHλλ∧∧≤⎇_,=h≠8.
y1⊂_8P:4→P826λ87tg≥2y⊂!nd sEarchqpwards&

α∪∩α1β+p	.93q~yP3']w2⊗⊂→y93)_vrP 2eturnq niL,λ
∀~(~+↔↔∪CKπw %↓↓αα2NV∃⊃↓Eβ&y↓Iα∂∪⊂∨_Q!P@!9<\N∞X;]∧∧≥≤Y,≡≤hλ
≡≤hλ≡Yy ⊗Yw:⊂⊂≥42P⊂≤βa`≠JACF∩α#@↔⊗n,⊗n
d∧α¬&Tαπ≡\0≠mlβ"H∧∧λλ⊂.,⎇;9-n	⊂∀[⊂#2@7io iMphe@[∃]aCI%←\A↑αs3e1∧K@~πMRε6≥HRG~∀~-n≠h≠Z4qt≥0π pRint
     the Information (seE  print)∞A)QJ↓[@↔O≡∨¬βε{CC'}q↓β?2βS#∃ε+@↔⊗} αε7,≥V*ε≡1PRα∧∧αππ-≥f~>\@A≤<X	8≤4w:⊂≤2z:i≠9P⊂*λ4s⊂0H⊂6ry\psrP≥pyP:≡x2r  out and Nil  id∧A]↑4∀@@@AKee=dAMe¬[JAo¬fAM←U]H\~(~∀~∃∃mCYMIC[J∩@@A'U¬$@b↓CeN~(~∀β)!JAC⊗;W7↔w!βS=∧+[π∪7∪π7∃εK@~ε∀∞ε&b∞
vNwL↑"bε≡4π>OM∧ε/↔,n&∞nUa∃&FT∞ε&`Q$ααα∧
↔
π<\↔⊗≡\Bαεmz"ε∞dW6∞N\↔&N⎇dαε}d∩ε7]l7&N⎇dαε≡≥MBbπ↑=⊗v:∞Mε*α∞<⊗n*∞.Vf/1Q"αα∧∧ε∞⊗}↑Bπ∨L≡'&Nltαπε⎇≥g"ε≥l@N&≡,V∨&≥⎇bε∂4∧ε/↔,n&∞nT∞W≡/5dααε↑l⊗f7,≥V*ε≥Nv∂O1Q"αα∧∧π≡↑≡∞2ε␈l↑"ε∞o∀ε≡∞MN2π&t
↔'≡]Lbπ&≡BεODfNvN4εNr∞Mε*πMBph!Q M&Tπ6∞N\Rαε≡4ε
α
M↔∨"¬∞GOεT∧πε&N∞G∩εm}&jα,7αJD∞vF/,Tαπ'≡RεO1≤W6∞D
w⊂h$∧ααα≡πεg∃Dπε&N∞G∩ε≡4αε
∞Fbπ
⎇⊗w&↑$π&z∧∞FF*↑f∞g\≡FN}d
⊗rπMPO∨L≤6Zb∞>VO&≤-F(h$∧αααmw∩π↑<Rε∂4⊗rε≡,w.n]nBπ&q≤W6∞Ln&∞nT
w∩ε↑.&7⊗≥\Rε␈$&∞←N,⊗≡*Df␈⊗T∧εO~∞Mε(h$∧αααmw⊗j,VNvtW6∞N\↔&.D
w∩ε∀
FO∨D∧ε}2∞Mε*εl≥V*ε|dπ&FTg.v>M⊗}r∧&.Nltε∂π
M⊗. Q$ααα∧⊗v"∞Mε*ε≡,w.n]nG~ε≡Dπ>∂4↔πεM≤V"πMuBε∞lDε⊗∨∧
↔~ε∀&NvM≥f8N=⎇g&/∞Dπε}≥nF/⊂Q$ααα∧∞vFN=∧ε≡∞d&*π↑<V"π⎇≡FBα↑f∞b∞Mrε/l≥G.∂LTπ≡}\↑FFNltεNr∞Mε(N-≥f&Nltε≡}nLWG Q$ααα∧
'/∨D&.6},Rπ&Tε/6≥NV∂&≥⎇bε6}]f"ε/∀ε/6≥Lg⊗∞\U`hPQ!⊗/6≥Lg⊗∞\Tπ⊗/N↑&w~
m⊗bε≤dεvz↑f∞g\≡FN}d6∞r,Rε6}]f"pQ!PPN↑l⊗f7,≥V*α
⎇fgJ∧∞v␈⊗>1⊗Nr∧¬αW↔<↑BαπE⊃⊗n}LUBαπ=≥f≡*∧
fzα∧WG',∀αε7,≥V(h$∧ααα
≥f6␈-\↔&N⎇dεO~∞<↔6.D
w&F↑.vO≡UaPPh!Q$n∂,=αβ~Dε∪K;⊃⊃⊂Jα∧α3~k∃fRs⊂⊃⊃∩αα∧∧αα¬≤v*β5V3λh `H2 args

	(freturn p x) returns control  to the evaluation designated by	the pdl
     pointer p, and forces it to return x.  This "non-local-goto"  function can
     be used to do fancy recovery from errors.


evalhook	    VARIABLE

	If the value of evalhook is non-null, then special things happen in the
     evaluator.  When  a form (even  an atom) is  to be evaluated,  evalhook is
     bound to nil and the functional form which was its value is applied to one
     argument - the form that was trying to be evaluated.  The value it returns
     is then returned from the evaluator.  This feature is used by  the Stepper
     package described later in this section.

	evalhook is bound to nil by break, and setq'ed to nil by errors that go
     back to top level and print  *.  This provides the ability to  escape from
     this mode if something bad happens.

	In order not to impair the efficiency of the LISP  interpreter, several
     restrictions are  imposed on  evalhook.  It only  applies to  evaluation -
     whether in a read-eval-print  loop, internally in evaluating  arguments in
     forms, or	by explicit use  of the  function eval.  It  does not  have any
     effect on compiled function references,  on use of the function  apply, or
     on the "mapping" functions.  Also, as a special case, the	array reference
     which  is	the first  argument  to store  is  never seen  by  the evalhook
     function; however, the subexpressions of the array reference (the indices)
     will be seen.  (This special treatment avoids a problem with the way store
     works.) Normally the  evaluator does not check  the value of  evalhook, in
     order to save  time.  To make it  check, you must both  be in (*rset  t) -
     debugging	-  mode,  and	have  done  (sstatus  evalhook	t).    Not  all
     implementations need both	of those, but you  should always do both  to be
     sure.  If you use	the Stepper package, you  need not worry; it  does this
     automatically.


evalhook	    LSUBR 2 or 3 args

	(evalhook form	hook) is  a function which  helps exploit  the evalhook
     feature.	The  form  is  evaluated  with	evalhook  lambda-bound	to  the
     functional  form  hook.   The  checking of  evalhook  is  bypassed  in the


Page 3-32			   ∪3-1.5.2			   March 3, 1979
				  The System


     evaluation  of form  itself, but  not in  any subsidiary  evaluations, for
     instance  of  arguments in  the  form.  This  is  like  a "one-instruction
     proceed"  in  a machine-language  debugger.   If all  three  arguments are
     present, the second is a binding context pointer and is used as the second
     argument to eval, and the third argument is the hook.

	Example:


	   (defun hook fexpr (x)	   ;called as (hook <form>)
		  ((lambda (*rset)
			   (prog2 (sstatus evalhook t)
					   ;magic sstatus
				  (evalhook (car x) 'hook-function)
					   ;evaluate form
				  (sstatus evalhook nil)))
					   ;more magic
		   t))

	   (defun hook-function (f)
		  ((lambda (terpri)
			   (declare (special terpri))
			   (princ '|form: | msgfiles)
			   (prin1 f msgfiles)
			   ((lambda (v)
				    (terpri msgfiles)
				    (princ '|value: | msgfiles)
				    (prin1 v msgfiles)
				    v)
			    (evalhook f 'hook-function)))
		   t))
					   ;this is how to eval the
					   ; form so as to hook
					   ; sub-forms


	The following output might be seen from (hook (cons (car '(a . b)) 'c):

		form: (cons (car (quote (a . b))) (quote c))
		form: (car (quote (a . b)))
		form: (quote (a . b))
		value: (a . b)
		value: a

March 3, 1979			   ∪3-1.5.2			       Page 3-33
			   Maclisp Reference Manual


		form: (quote c)
		value: c
		value: (a . c)
		(a . c)


The following functions only exist in the Multics implementation.

baktrace1	    LSUBR 0 to 2 args

	baktrace1 is the same as baktrace except that binding  context pointers
     suitable for use with eval and apply are displayed along with the function
     names.


baktrace2	    LSUBR 0 to 2 args

	baktrace2 is the same  as baktrace1 except that pdl  pointers, suitable
     for use with baktrace and evalframe, are displayed along with the function
     names and binding context pointers.
























Page 3-34			   ∪3-1.5.2			   March 3, 1979
				  The System


1.5.3  The Trace Package


   The LISP trace  package provides the ability  to perform various  actions at
the time a function is called and at the time it returns.  This can be used for
traditional tracing or for more sophisticated debugging actions.

   The trace  package is not  part of the  initial environment; however,  it is
automatically loaded  in on  the first	reference to  the function  trace. (See
autoload.)

   The LISP trace package consists of three main functions, trace, untrace, and
remtrace, all of which are fexprs.

   A call to trace has the following form:
			      (prace trace←specs)
	
A trace←spec in turn is either an atom (the name of the function to  be traced)
or a list:
		      (funcTion-name option1 option2 ...)

where the options are as follows:

break pred	causes	a break  after printing  the entry  tpace (if  any) but
		before applying  the traced function  to its arguments,  if and
		only if pred evaluates to non-nil.

cond pred	causes	tpace  information  to be  printed  for  function entry
		and/or exit if and only if pred evaluates to non-niL.

wherein fn	cauSes	the function  to be  traced only  when called  from the
		specified function fn.	The  user can give several  trace specs
		to trace, all specifying  the same function but  with different
		wherein options,  so that the  function is traced  in different
		ways when called from different functions.  Note that if  fn is
		already being traced  itself, the wherein option  probably will
		not work as desired.  (Then again, it might.)  Note that fn may
		not be a compiled function.

argpdl pdl	specifies an atom pdl whose value tpace initially sets	to nil.
		A list	of the	current recursion level  for the  function, the
		function's name, and  a list of  the arguments is  cons'ed onto


March 3, 1979			   ∪3-1.5.3			       Page 3-35
			   Maclisp Reference Manual


		the pdl when the function is entered, and cdr'ed back  off when
		the  function  is exited.   The  pdl can  be  inspected  from a
		breakpoint, for example, and used to determine the  very recent
		history  of the  function.   This option  can be  used	with or
		without printed trace output.	Each function can be  given its
		own pdl, or one pdl may serve several functions.

entry list	specifies a list of arbitrary S-expressions whose values are to
		be  printed  along with  the  usual entry-trace.   The	list of
		resultant values, when printed, is preceded by a \\ to separate
		it from the other information.

exit list	similar to  entry, but specifies  expressions whose  values are
		printed with the exit-trace.  Again, the list of values printed
		is preceded by \\.

arg		specify that the  function's arguments, resultant  value, both,
value		or neither are to be traced.  If not specified, the  default is
both		both.  Any "options" following one of these four are assumed to
nil		be arbitrary  S-expressions whose values  are to be  printed on
		both  entry  and exit  to  the function.   However,  if  arg is
		specified, the values are printed only on entry, and  if value,
		only  on  exit.  Note  that  since arg,  value,  both,	and nil
		swallow all following  expressions for this  purpose, whichever
		one  is used  should be  the last  option specified.   Any such
		values printed	will be preceded  by a //  and will  follow any
		values specified by entry or exit options.

   If the  variable arglist is	used in  any of the  expressions given	for the
cond, break,  entry, or exit  options, or  after the arg,  value, both,  or nil
option,  when  those  expressions  are	evaluated  the	value  of  arglist will
effectively be a list of the arguments given to the traced function.  Thus

		   (trace (foo break (null (car arglist))))

would cause a break in foo if and only if the first argument to foo is nil.

   Similarly, the variable fnvalue  will effectively be the resulting  value of
the traced function.   For obvious reasons, this  should only be used  with the
exit option.

   The trace specifications may be "factored."	For example,


Page 3-36			   ∪3-1.5.3			   March 3, 1979
				  The System


		     (trace ((foo bar) wherein baz value))

is equivalent to

	    (trace (foo wherein baz value) (bar wherein baz value))

   All output printed by trace can be ground into an indented, readable format,
by simply setting the variable sprinter to t.  Setting sprinter to  nil changes
the output back to  use the ordinary print  function, which is faster  and uses
less storage but is less readable for large list structures.


      Examples of the use of trace:

      (1) To trace function foo, printing both arguments on entry and result on
   exit:
				  (trace foo)

      or (trace (foo)) or (trace (foo both)).

      (2) To trace  function foo only when  called from function bar,  and then
   only if (cdr x) is nil:
		 (trace (foo wherein bar cond (null (cdr x))))

      or (trace (foo cond (null (cdr x)) wherein bar))

   As this example shows, the order of the options makes no  difference, except
   for arg, value, both, or nil, which must be last.

      (3) To trace function quux,  printing the resultant value on  exiting but
   no arguments  on entry, printing  the value	of (car x)  on entry,  of foo1,
   foo2, and (foo3  bar) on exit,  and of zxcvbnm  and (qwerty shrdlu)	on both
   entry and exit:

	      (prace (quux entry ((car x)) exit (foo1 doo2 (foo3 bar	)
			   both zxcvbnm  qwerty shrdlu)))

      (4) Do  trace fUnction  foo only when  calledby	functions bar  and baz,
   printingargs on entry and resulton eXit, AeS]i%]NAi!JAmC1k@∃β|1↓↓#∂+Waβ⊗K_4R↓↓β∂∪C!%∧{9β↔FKQβ≠⊗{5β≠|yβ←#.qβ∂πfc↔⊃β↔IβπRβ?;3Jaβπ≠"↓β∂?v#'S'}sπ33JβK↔∞[';≤hQ↓↓β>C↔9β≤∧⊗fF\@ε↔J,↔∩ε≤dε
ε↑≡V∞g4#Ph!Q hPQ)V∂⊗=∧β~bε↔∪;H⊃⊃∩ααα62k
fUc_H⊃∀ααα∧∧α¬ε≤|Rβ~V6phP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`HαC"APA"B∧∧λλλ∧∧
≥≤L≤y(
m{h∃m<Y2-d_X<D\Y8-4λ→0_]pv⊂! b))
		      (foo wherein baz exit ((quux barf barph))))

      (5) To tpace dqfcTions phoo  afD`¬bXA9KmKd↓aeS]QS]NA¬]siQ%]N@A→←dAK%iQKd0~∀@@↓Ech∪MCmC]≤∪CYX↓CeOjαk↔;S~↓β≠?⊂↓β≡αMαε}d∧ελ∞=x-]{H≤Mλλ⊂l≥≠→1∧∧→[`↔\26⊗⊂_w2εEλ⊂⊂19→pqt@ne insi`e phoo Id∧A`A%`
β;L¬C@"C"A∀λλλ∧∧λ
≥∞0qrP
847gλ0y3x→4⊂3/opdl break (nulh p) condnid 9SXB~(∩∩@@@@@Q→jAC↓⊗;C∪1∧3??C&aβ∂?t!βπbβ;'⊂J@4(Q$ααα∧∧¬&FT∧&≡}l@λ
m8ε⊃ prev@∃]afA¬]siQ%]N∪CPAC@3bβ∪K∨hβ↔'v9βCKLsS↔⊃p↓↓αSF)βO↔_¬vv Q$ααεm→BεNdλV∞≡∧
G,8y(∧∞|→0⊃λ9x2aZq0riH840zλ70∂Args  or valpJA¬eJAi<@AEJ↓aeC]QKHv~(@@AC1iQ←K≥PAiQ∀AG←]⊂AUCX↓o←kY⊂AaeKspecifying this too
   prevents trace from even setting up the mechanisms to do this.

      trace returns as its value a  list of names of all functions  traced; for
   any functions traced with the wherein option, say (trace (foo wherein bar)),
   instead of  returning just foo  it returns a  3-list (foo wherein  bar).  If
   trace finds a trace spec it doesn't like, instead of the function's	name it
   returns a list whose car is ? and whose cdr is an error message.   The error
   messages are:

(? wherein foo)  trace couldn't find an expr, fexpr, or macro property	for the
		function specified by the wherein option.

(? argpdl foo)	The item following  the argpdl option was not a  non-nil atomic
		symbol.

(? foo not  function)  Indicates that the  function specified to be  traced was
		non-atomic, or had  no functional property.   (Valid functional
		properties are expr, fexpr, subr, fsubr, lsubr, and macro.)

(? foo)		foo is not a valid option.

   Thus a use of trace such as

		 (trace (foo wherein (nil)) (bar argpdl nil))

would return, without setting up any traces,

		      ((? wherein (nil)) (? argpdl nil))


Page 3-38			   ∪3-1.5.3			   March 3, 1979
				  The System


   If you attempt  to specify to trace	a function already being  traced, trace
calls untrace before setting up the new trace.	If an error occurs,  causing (?
something) to be returned, the function for which the error occurred may or may
not have been untraced.  Beware!

   It is possible to call trace with no arguments.  (trace) evaluates to a list
of all the functions currently being traced.

   untrace is used to undo the effects of trace and restore functions  to their
normal, untraced state.  The argument to untrace for a given function should be
what trace returned for it; i.e.  if trace returned foo, use (untrace  foO); if
trace returned (foo wherein bar) use (untrace (foo wherein bar)).  untrace will
take multiple specifications, e.g. (untrace foo quux (bar wherein baz) fuphoo).
Calling untrace with  no arguments will  untrace all functions	currently being
traced.

   remtrace,  oddly enou@≥PX@A∃qak]≥KfAi!J@AK9iSeJ↓ieCG∀@AaC
SCOJ8@A∪hAiCW∃fA]↑4∃CeOU[K]iL\~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)≠CeG @fX@Drnr∩$∩@@@LfZb\T\f∩∩$@@@@@A!C≥J@fZLr~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀b\T\h@AQQJA'QKaaKH~∀~∀4∀@@AQQJ∪→%' @EMiKaa%]ND@↓aCGW¬OJ@A%fAS]QK]IK⊂@Ai↑AOSm∀AiQJA→∪'@@Aae=OeC[5KdAB4∃MCG%YSir↓C]CY=O←kf↓i↑Ai!JA∪]MiekGQS←\@↓'iK`↓[←IJ↓←LAeU]]S]≤AB@A5CGQS9JAYC9OkCO∀~∃ae=OeCZ8~∀~∀$∩∩@@@@@AQQJA%%GPA'QKaaKH~∀~∀@A)Q∀A%SG AgiKAaKdAACGWC≥JAae=mSIKLABAg%[aYJ0Ag[C1XAIK	kOOS9N∪GCACESY%ir\@↓∪h~∃%fACm¬SYCE1JACf↓BAYS	eCer↓ae←OICZAS8AiQJ↓∪)&A%[aYK5K]iCQS←\\4∀~∃⊃=nAi↑↓+gJAQQJA'Q A
¬GSYSQr~∀~(~∀@@↓)QJAACGWC≥JAG←9iCS]LAio↑↓G←[a%YKHA→k]Gi%←]fA]QSGP↓CeJA1←CIK⊂AEr~(~∀∩∩$QMCg1←CHAMiK`A→CgXA⊃gVAY%EYg`$~∀~∃QQJAkMKdAS9iKeM¬GJASLAiQe=kOPAQQJAMU]GiS=\@QM∃qadR↓giK`0AoQS
PAgKQfAgo%iGQKLAi↑~)akhAQQJ@A1∪' A%]iKeAeKiKHAS\@↓C]HA=khA←_@@EgQKaaS9NDA[=IJ\@↓)QJ@↓ECgSAG←[5C]If4∃CeJh~∀~∀4∀∩@@@@@QMiK`APR∩@@@@@wQke\A=\Agi∃aaS]≤A[←I∀\~∀∩@@@@QgiK@A]SX$@@@@@w)kI\A←M_AgiKAaS]N↓[←IJ8~∀
∃QQKgJ↓G←[[¬]IfA¬eJAkMkCYYdAisa∃HACh↓i←`A1KmKX0AC]H↓oSYX↓iCWJ↓KMMK
hAS[5KISCQKYr~(QR]J8AiQJ↓]Kqh↓&[KqAeKgg%←\AieaKHA%\AoS1XAEJ↓KmCYUCiKH↓S\AgQKaaS9N@A[=IJR\↓βYg↑4∃5NX↓S\AC⊃ISiS=\Ai↑↓eKikβ∪;'≠8∧π&Z∞MwαεLZf.bD∞G/⊗n4ε}6d∞7&/∞
⊗v:
]v&*aQ h∩∧∧∧Nr∞>F/π
→f:ε]xF*b∞Mε*∧I~5αε↑l⊗g∞≡Mw$≥z;
↓⊂894[:⊂7z]⊂2pqZ⊂)Vr↑892i\tp∂n  to Be
evaluate` bedkre evalUation, and  the retupned↓mC@3,)βπ≠&+A↓β-3π3W∂#'?9bβ∂π3dK;≤4TCSO↔`∧bπ⊗\>W↔≡≡hVgJ∞Mrε&≡:εf∂∀λ

(λ∀nL<≤→,D→=P.]_9~-⎇H≠`∪λ2pqtλ0y3z[rp∞t,  if the
S)express@%←\@A%`
↓βλβ↔∞l:FN}d∧ε≡∞MEbααλ≤g&/$	
≡|≠⊂⊂↑tp∞G	each S ≠JβCCK↔≥≠'?9bβS#∀hS↔[πg+πS?⊂β←'MDπ>∞≤@ε⊗.mpLT→=P-N89~-⎇H→@↔\α a @
←[[C9HAGQ¬`π∂&+Aβ≠⊗{5βSF)β∂?w≠?3∃Ph (!Q"αα∧∧βg∨≤6+p⊃∀∧∞}nM⊗w∞T∞7&/∞λ
-lh≤Y,><Xp∀]2v$WβE
     <pqboUt8$JαO#?8βC↔S,ε&v.D
f∞g\Tε.Y{ ∞
~8h
=Y0⊗λ7w6 9, and continue
λ	↓	 qteppingUpsa@%⊂X∩∀~(~¬!C≥J@fZP`∩α∩@@&f4b@→Uq $$∧α↓α7π⊗≠!↓Mb↓EE]Hh(0$$HI↓αSF)αOG≥#↔4∀Ph ( ∧αααπH7∪@H≠tDπ≥_8Ga(∃≥.-Hλ≠lLHλ≤nL<≤~-lhλ≠-|→+H∧¬_Y5∧∧_{sNM;]9$∧→=X-N8=~-⎇C"B!⊃(≥z.M≠⎇=∧∞⎇→<∞
;Yb%a"C"D∧λλλ
↓""(
,9~4n
_>(><\Y-nλ→Sn-(~3D];⊂⊗λ∀4W2K⊂;tz~7zz⊂≤94w6→{2vεB∧DDP≠y⊂89~w62w→z4∀FBεE⊂⊂λ⊂⊂!∧BDP#r]⊂192Xux7t[:≥P8≤7qrrY⊂;tz~⊂∩(εBεE⊂⊂λ⊂⊂&DBDP)bYP0r;_w1rrλ32pz≥y2yP≥w22yλ)z2x≤4w3@∪pqy7H"|80[9tww≤WεEεB&wy2H r;0[1rr⊂⊃2pz:\2yFEβEεE⊂λ⊂)rf→qz4{→v<P:≥y74g→P7w⊂≤z2x≥βEεE∧BDP⊂⊂λ⊂∀9z→x⊂37[XP37[Y⊂↔↔∀FEεB$s⊂:~4yP1[vvpw→⊂4yP≥<x2rλ0z⊂:≠x⊂62]2v⊗⊂≤z2x8~w3P;Zv6⊂7≠z⊂⊂1[vvrw_rP4v[rr4p]2v<VβE1:zλ90z4→y⊂;t→w⊂:4→P2{0[:pz7\⊂34y≤z⊂2w_wzw:→y9P0H)Vr|≤92yyZww⊂;Z7yrP_py⊂⊂~yP7w→FE7sλ⊂37wLV⊂37[Y⊗⊂⊂→z1W⊂λ*44yH⊂37y≠P;tv≠∧z42[⊂24y\60|Pλ0z⊂:~2P⊂1[w9wv→V∧pw→⊂:42CE2{0[:pz7\⊂;tv≠⊂12P~w⊂9z→x84w→P6wr→P;pt]4w3P→7y⊂0H1wvvXw2⊂1Z0y0q]2y↔εBεE⊂⊂λ)z2x≤4w3P∪pqy7H"|80[9tww≤]εEεB⊂⊂⊂$Y⊂:42H9z2x≤2y⊂4\P897Xrrr2Y⊂;tz~⊂⊂0P∂9x0qY←⊗⊂4]⊂;tv≠⊂77zλ9z2xλ⊂:42H2|2q]z4wwβE7s⊂≠pqy7H⊂2|8_w9tw[9V⊂1≥z⊂⊂;Zv6⊂9_z42yαu:yzλ9t7{H⊂:42H92yz[:⊂⊂7Y⊂:42H⊂6pq\7P7sβE2|8_w9tw[⊂0w2λ;ptzλ37y⊂_w7z4→y⊂1w[vpw2εEεEλ⊂⊂*7H9rrP≥42P2↑2qzz~ww⊂7Y⊂:42H6pqy≠P2|8_w9tw[⊂4z9Yv3⊗⊂≤97qrYr⊂:4→P9z2\82y⊂≥tz4εB0w⊂&H4w9z→pr⊂7Y⊂0P≡≤x0qrO↔εEεB⊂⊂⊂*\tw3P≤z2x⊂≥tz4⊂_92pu\7tw:≤]εEεB⊂⊂⊂*~2P0q≠{2P2→yqy4\:4wwλ0x86~ryP:≠P::y≠4w3P≤z2x8~w3P7[⊂0w2λ7s3⊂→v7q0[6<P0]⊂:7xβE62{→v↔∧f[y2P2→z0tvλ4yP7→qryyXy<P:≠P:yrH9z2xλ362|~q6<P~w⊂0w→⊂7zzλ7s⊂1≤2pux≠tw:9CE∀2W→W⊂:7Yrz42\⊂;tz~⊂:90XrTWεBεE⊂⊂λ$s⊂9]2x84[3P4yH::y7→r⊂7wλ1<P∀≤z2x⊂≥∀P0zλ:7x⊂≠2{2v⊂:42H2{0v≥pz7yλ;tv6λ''j⊂_2FE4[⊂⊂9z→x84w→P⊂6wY2P⊂;Zz44wλ0P⊂1≤2pux≠tw:⊂λ67wx⊂⊂⊂$Y⊂<wzH⊂;tyZ∧z7Pλ:yrP≤z2x8→rεE2]0v:p]4ww⊂λ;tz4~w⊂0Pλ192pZP⊂67[x⊂<w]P⊂6z\z⊂::\7⊂⊂4]⊂⊂7wλ67qp[6<P⊂_<P⊂∀≤z2x⊂≥∀WεE⊂ww;2\9rv<K⊂4s⊂≤z2x8~w3P;XyP77]⊂::y≠2r⊂7[⊂⊂0zλ:7x⊂≠2{2vλ0w2⊂~z⊂4yH::y7→r⊂⊂7[⊂1<FB∀9z2\⊂:∀P~w⊂0P_92puH67wx⊂4z⊂≥tv6⊂∪'j⊂1→P7w⊂≥t2w⊂≤2z:y≠⊂4yP≠pr2P→97vPλ:42P_92puCE67w\⊂1<P	(↔εEβE&py_t⊂→Vλ_\[\BDDP⊂λ	YVXK~W~∧BDP⊂⊂λ⊂⊂⊂(_srP→KZ_FEManual


   However, executing  (step nil) inside  a break loop	will turn  off stepping
globally, i.e. within the break loop, and after return has be made by $P.

   The most useful feature is the following, however:

     (step)		 Command at top level has no immediate effect.

   After (step) has been executed at top level, a subsequent (step t) inside of
a break loop will have the  effect of turning on stepping mode both  inside the
break loop and globally, i.e. the  evaluator will start to step as soon  as the
return is made from  the break loop by $P.   Thus, for instance, one  could set
trace  to break  at some  special  place, and  then use  the break  to	turn on
stepping.

   prinlevel and prinlength:

   In  the  present  version, for  convenience,  prinlevel  and  prinlength are
lambda-bound inside the hooking function to 3 and 5 respectively.   These could
be changed by editing the expr code and recompiling.

   When the P command is  used, prinlevel and prinlength are  temporarily bound
to nil, and the toplevel printer (the value of atom prin1) is used to redisplay
the current form.

   Overhead of Stepping:

   If stepping mode has been turned off by ↑g, the execution overhead of having
the stepping packing in your LISP is exactly nil.

   If stepping mode has been turned off by (step nil, every call to eval incurs
a small overhead--several  machine instructions, corresponding to  the compiled
code for a simple cond and one function pushdown.

   From an overhead point of view, running with (step) entered at top  level is
the same as running with (step nil).

   Stopping stepping by responding <tab> incurs the same continued  overhead as
(step nil).

   Running with (step foo1 foo2 ...)  can be more expensive, since a  member of
the car of the current form into  the list (foo1 foo2 ...) is required	at each
call to eval.


Page 3-42			   ∪3-1.5.4			   March 3, 1979
				  The System


   In  terms  of  memory  requiRementq(  The  total  compiledAgiKAaS]NαβCπ∂↑∨∀∀Ts∂∂WεK↔Mβ∞∪?WQβ!IMβ>{K∪Mε{⊂∩ε-≥f∂↔∀
π⊗↑x,⊗jπ>Mwε∞|U`hPβ"H∧∧∩;]↑X8⎇
≥{H∃m≡~λ→\]9`⊂_w2⊂*≤αace:
~∀@A≥↑↓caKπ%CXAS9iKeC
iSO]LAWLAQQJAgQK`Aa¬GWCO∀AoSi AIKEUJXAiICGJX↓←d@A¬]rA←β##↔HhSOgO&+5βC∞≠ ≡∞|Z2ε∂,TεNv}⎇b`h!Q h⊂⊃⊃∩αα∧
FF*	]w⊗>]n7&/-`¬∨&↑
ε/⊂Q!PBα∧
FF(α3;ny;\nL<[@∧
⎇→<∞<Hλ∧∞_8rl≤y"0_≤5{4b→yP⊂"→q:ssZw3P⊂λ1p`⊂AbidiTias  f`∂d~)S]iKIaeKi∃HA	∪M Aae=KeC[LAiQCP∪CeJ↓G←[a¬eCEY∀Ai↑Aβ##∃β≤∧↔ε∞-→FO&≤↑2απ∞-w6NL\Bε↔⊃Q$$∃λ⊂∪≠y⊂ y\prq6→y⊂1@/de.  Thes@∀AGC↓¬ESISQSKfA%]GYk⊃Jt
∀4∀∩∀b$A'S]≥YJAgQKaaS9JAiQI←kOP↓iQJA∃mCY.S'?rβ?→αλβ∪G;≥#'?9ε;⊃β⎇3↔Iβ⎇⊃↓β'w#=β?&C↔H∀R↓↓↓βNsS↔K¬∪↔S↔ β∪W≠≥#'?;~aβ←#.qβ∂πfc↔⊃1αβ?9βλβO↔3.≠S'[*βπOO→βπMαβ∪↔S/∪7';.!βdhQ↓↓↓π##∃β/≠↔I9αα↔π∂BβOW∂Bβ≠?Kjβπ;⊃εKSMβ⊗+OW3&K;≥β63W∃εkπeβ⊗)β∪'∨β3πg.!84(hQI%α'K;π7N→βK./C?NsS';:β?9β}s∃β?∩β7?K*β?→β&C∃β≠}c3?←Ns≥β∂}s∪'SN{;Miα↓βS#*β≠?Khh)↓↓αβ?Iβ∂#?5β∞∪?WQπ#=β*β↔[πg+πS↔"β7πS≡C↔Mβ
βCπS&+K9βN{UβC⊗{['∪+YβS#*β≠?Kjβ↔'v84)↓α↓β↔[∞cWπS.!β';6{3[↔~β¬βOε+∂'≠N+⊃β≠.s∂S'}qmβ¬ε;'[↔rβπS?nK
βONk?1ε+[π3.S↔Mπ#<4)α↓↓β¬ε;'[↔rβ[π3.)mβ¬ε;'[↔rβπS?nK
βONk?1εKMβSzβ∃β⊗{W;⊃εK9β¬πβK?≥b↓β↔'&C↔Iβ'KC∀4R↓↓↓β}0'∪=bβ?H'∞q↓β↔61∨⊃εcπ7&	7↔cπ∪↔OON{9m↓ε{IβWε{8'πr↓βπK⊗KSKπ↔Iβ∂?v#'S'}p4)↓α↓βOC.≠'≠'.!βeε	βCK.#'∂π&)β←KO#S↔9εMα2M~Aβ∂}#∃84Ph)M%ααK↔S/∪;';:β¬↓β&K≠≠↔⊗+;Qβ63W∃αβ≠?Iε	↓β∨O3↔9α~k↔cC⊗+OO'}q9↓↓¬##'Mαβπ33␈;Mβ≠␈⊂4)↓α↓β∂#∞s∨';:βS#∃ε∂S'}qβS#∂!β←?.c⊃↓β⊗)βO↔f+∂S↔"βeβ≡{;∪'&K?;πg→β'9αβS#∃πβK?∨⊗44)α↓↓βπv!??Iε∪eβ∨z;M↓βNqβ¬βπ∪?≥↓ε{Iβ∪zq↓αg␈)↓β∂∞qβπ3≡yβ∨=αβS=β∞seβS∞9↓β'w≠'∪∃π##∀4R↓↓↓β∨+KK↔w!βCK}984(hQQ%α&C↔O∃ε≠πCπ⊗K3'SN+Mβ7∂Iβ∃π∪↔GW/≠S↔⊃π;#↔9π##∃βπ∪?∨K∞iβ'MεK;'SN33eπ≠SπK&+⊃βHh)↓↓αβ¬βS␈↓73↔6+1β≠␈∪51β␈⊃βS#/Iβ7πJβ∃βNs'S'∂#↔⊃β∂!βπ;Jβ?S#/⊃βC?NsQβ'rβS#∃ε≠?WK≡(4)↓α↓β?→ε+c↔∂/#'?9αiβ↔'&C↔Iβ7∪?5β&C∃βS/∪7';∞aβ←#Nc∃β'rβ¬β⊗+π/C}K;Q1αβ?Iβ&KK↔∂&cd4)α↓↓βJβS#∃πβK?∨⊗584Ph(4)α↓αS#*βOS↔πβ↔Iβneβ*β';[}[↔⊃βNs'S'∞c3eβ↔IβWONs≥βSF)β≠Wv≠S'?rβ7↔YεM↓β}s∃β←␈+3⊂4W+O∃β/3π1β}1β?;*βπK∨.k↔;QZβ∃;≥pI↓#7/1↓≥#6≠9βπ⊗9Eβπ⊗9I%%r↓α≠K}iβ¬↓ε∪K↔π←β?';"β?H4VK9↓β
βCK??∪π50O##∃β∨#↔CC/⊃↓β7∂Iβ∃αβSWKv+⊃β?pKeβNs[?/Ns≥↓↓FC/OS∂∪Q$'>KS!βvx4+π⊗;W7↔w#M9↓∧KQβ7∂Iβ∃π#WK;.!β?≠2βeβ&C∃βEε≠?77∞s⊃β∪/≠∂K'⊗+⊃β.c?]1ε{Iβ?2β∂?W↔≠∀4(hP4*7∂∪∂!↓~a↓Ee;H$$%α↓MMk	9U9 H$%↓α↓↓↓↓¬βπ∨∃β→5QLhP0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4+Jβ¬α∞%∩1?≥ε∪K↔πZq↓απ7#↔Iβn+Yβ↔63Wπ&+Mβ''→βπK?+7↔;"aβ'Qπ∪↔SW⊗sMβSF)↓β[∞cW∃β∞s⊂4+'+K;Mε{≠→β&C∃↓β∨#↔CC/⊃9↓αv{S∃β&CπQ↓εK9βSF)βπ␈3∃β↔F7C3*↓βS#*β≠?Kjβ∨'[.q↓βπ~βπ84VK∨Wn+;Qβ&yβ7↔2β←πMπW?S.!9↓αN11βO∂I1βSF)β[πg+∃β?2β→β←∂→βS#*↓αM7/CCK↔∨≠'?9αC≠∂8hSπK≥
βπK≥∩I1βSF+9β?v)β∂?.c⊃βW≡)↓#7/1β→%εK;OS.⊃84Ph)↓↓∧Q↓β∞seβC}K;Q↓ε#WK'v9βS#*↓βOS/βC';:a↓β?v)β7πJ↓β';∨β↔∂Qπ##∃↓π3π3W/→↓β?2β?S#/⊂4+[∂∪'πf+M1β∞s⊃β↔6+9↓β⊗+πCCgIβ7↔2βS=↓ε;eβ6{K58M##'Mεkπe↓ε∪∃β∪}s∃β'r↓β↔'&C↔Iβ}04+SG∪↔∃β>gM9α↓α↔π≡Aβ∂?nkπ;⊃π;'31αβ∃βπ∪?7C&+⊃β≠␈⊃↓βJ↓==1π+OWπfce↓β6{33?>K;≥β&C∀4+fOQβ6{K5βπ∪';S.!β?W"p&π;JαM7↔GβK↔O≡K?9β&CπQβO→βSgε+⊃β←FK∂!βO→↓β;␈!βK↔≡{∨;'V+⊂4+∂→β¬β≡{77πv!β←'faβ∃ε+[π1>!↓#←O##'9ε9β↔↔∪O↔Qπ#=β∂∂#∂!β/∪K?K~I9↓α∞cS↔KvS'[.ce04W##∃β*β∂?7n;⊃β&yβ↔[∞a↓βπwIβ↔cπ∪↔OON{91β␈⊃βS#*β!↓β≡{77πv!βS=ε;↔Qβ
β;'∂(KSgC*β?_4T~RJ1|AβK.-9↓αBS#'~β'Mβ⊗+π33Jβ¬α∞%∩1?	ε∪K↔πZaβW"β'Qβ/≠↔⊃β&yβ∃∧~RJ1}A↓βOzβS#∀hS∂?7n;⊃βFCC↔w→βS=ε∪∃β∂∞c3↔⊃εA9$4Ph)↓↓εK9βSF)β'S~β'7Cd+7↔≠&S'?rβ↔π∂B↓β∂?nkπ;⊃εkWOQε∪∃β≠}c3?←.!βeε	↓βOε∂∃↓G+;3↔∨_4+SF)β∂?nkπ;⊃αβ'Mβ
β3'O"I9↓↓εK9βSF)β7Wg#'∂Mαβ'7Cf+7↔;&S'?rβ↔π∂Bβ∂?7n;⊂'o+OQβ⊗(4+≠}c3/←.!βeε	β;↔>c';∃pKπ∂S.33EbβS#'~β∪↔C.s∪Mβv{Qβ?rβS#∃εK7C3.k↔;S∂#'?9ε∪WQβ}p4)#∨#πSW~β3';n{∪∃%r↓β↔π≡Aβ≠?⊗iβπ; ↓βK↔∨+3Qβ>C'∂!εKEβC⊗K;S↔ β?WQ¬;'31αβ∃β4{33?>+⊂4↔I↓∂;.k↔I∧K;∪'≡S';:βS#∃f evaluation (i.e. stack  depth since
invocation).

   the primary commands are:

d  (mnemonic  for down)  go down  to the  next deeper  level of  evaluation and
   display the first form  there before evaluating it.	 e.g. if the form  is a
   function call, this	will display the first	argument of the function  if it
   has arguments in the call; otherwise it will display the  first s-expression
   of the body of the function.  it then prompts for the next command.

e  (eval) can  be used to  evaluate an arbitrary  expression.  it starts  a new
   line, waits for you to type the expression, then eval's it within an errset,
   and prints the result.  this is comparable to just typing the  expression or
   atom after the //, but cannot be confused with a command, and the  format is
   nicer.

h  (control-h) enters a break  loop, and when $p'ed displays the  current form.
   within the break,  one can inspect the  values of variables, etc.,  and even
   reapply mev to any form.

n  (next) Display  the next form at  this level, without showing  or inspecting
   the evaluation of the  lower levels of the  current form.  The value  of the
   current form is displayed first.  If  you wish a condition to be  tested for
   at lower levels, use nn instead.

Page 3-44			   ∪3-1.5.4			   March 3, 1979
				  The System


nn Like n but slower since it inspects the lower levels.  Use instead of n when
   testing for a condition.

u  (up) Go up to the next higher level of evaluation and show the next	form at
   that  level.  The  form(s) at  the current  and lower  levels  are evaluated
   without  display.   As  an example  of  its	use, after  you  have  seen the
   evaluation of the arguments to a function, the next form to be evaluated, if
   the function  is being interpreted,	will be the  first S-expression  of the
   function; to avoid seeing how the function is evaluated internally,	you can
   type u.  Note that the lower levels are not inspected - thus if  a condition
   is to be tested for at these levels, use uu.

(u num)  If num  is positive (or zero),  forms are not inspected  nor displayed
   until level num is  returned to.  If negative,  it goes up (abs  num) levels
   relative to the current level.  Thus (u -1) is equivalent to u.

uu Like u but slower.  Use if testing for a condition.

(uu num) Like (u num) but slower.  Use if testing for a condition.

q  (quit) Exit from the stepper.

s  (show  or display mode)   For datapoints and  other display	terminals, this
   gives  a nice  easily read  output of  selected levels  that  constitute the
   context of  the current  evaluation.  Specifically,	it selects  the current
   level for sprint'ing (pretty printing) as a "header", and as you  go deeper,
   the local context is  abbreviate-printed under this header, and  the current
   output will be  sprint'ed.  s may  be used as  often as you	like.	Headers
   will automatically be popped when you return.  The command (s num) selects a
   particular  level as  a header.   It  and the  command sn  and  several user
   settable parameters are described in the more detailed section below.

(= s-exp)   The S-expression is  substituted for the  current form  and another
   command is prompted for (i.e. you can step into or over the new form  if you
   want  to).  When  the  resulting value  is returned	it  will be  as  if the
   original  form had  yielded that  value.  For  example, you	can  change the
   apparent truth or falsity of predicates  or bypass a (go label), as	well as
   just returning different values for an S-expression.

(cond ...)  Tests for conditions  prior to evaluation of each future  form, and
   when satisfied will print a message, display the form, and wait  for another
   command (which may of course be  h for a break).  The argument to  this cond


March 3, 1979			   ∪3-1.5.4			       Page 3-45
			   Maclisp Reference Manual


   is an arbitrary S-expression or symbol which is evaluated like  a predicate.
   This is similar to the cond feature of the trace package.

   In specifying the predicate, the form about to be evaluated may  be oBtained
   as the value od∧AiQ∀AmCe%CEYJJKM←IZT@AQQJAKaaeKgMS←\@!Q←←W1KmKX$AeKiUe]fAQQJ~∀@AeK1CiSm∀AYKm∃X@A←_AKmC1kCiS=\\@@↓≠←eJ↓iQC\A←]J↓aeKI%GCiJA[Cr↓EJ@A≥SmK\0AS\~(@@Ao!SGPA
CgJAQQKrA¬eJA←HOKHAQ←OKi!KdXA∃qGKaPAoQK8Aio↑↓CeOk5K]if↓MWeZ↓BAga∃GSCX4∀@@AQKghA¬fAIKMGeSE∃H@AS8AiQJ↓[←eJ↓IKiC%YKH@↓gCGi%←\AE∃YWn\A)QJAG←]⊃SiS←8AoSY0~∀@@↓eK[C%\@AC
iSmJACh@↓CYX@↓YKmKαcEβSFQ↓β∂∪∃↓βNsOC↔≥#↔⊃↓ε∪e↓β&C∃↓β≥#↔CC/⊃βW;&K04	α↓β↔cεc'∂'&ceβS/∪;↔⊃ε{≠→β↔I↓#∂}s⊃β;Na%λ4Ph)↓↓αC7πS≡C→↓9rq%↓βO→β¬↓ε3W;∂&K?9β>C'∂!αβ←'∪bβCπS&+K)↓εkπS∂Bβπ∂πNsOQ↓π##∃β≤εW↔⊗]n@hR∧∧ε6␈-Ub∧OD
V∂J,Rαπ↑<V"ε≥dπ&FT∞π⊗.M≤6∂&T
v"α∞Mε*ε=⎇f"r∧¬∧∞g=tπ≡.T∧εO'4∞&.f≡LV h$∧απ/<Tε∂~∀ε≡}]\⊗v"e∀α¬&Tε∂⊗}]V.wD
Fzε\≡F≡Fd
↔~ε=⎇Wε∂,\Bπ&t∧R.6}-Rαε]LVn.nDε↔HQ$ααε]LVn.nDε7⊗⎇Tεf.nDαπ&t∞&N>∞EBε∞lDπ∨.<<V.'4∧π>F]dε.∞=∧ε.f]\Vw"
|bαπMRπε≡NF/⊗aQ"αα∞>V≡≡\\G~r∧	v2ε≥↑ε␈↔L≥f≡*D∞FF*∞↔'&↑-bαεl\V"εm}BεNl=G.&T∞FF*]g&O,Tαε6}-Rrα¬!PRα∧
V∂&=W~ε≥o↔&F≥lrrα
Mε*π∞-v≡.N↑&*ε≡4ε∂π
M⊗."∞,V∨/.=↔6.O∀π&z∧∞7.⊗M≡7'~D∞Vvf↑>0hR∧∧π&FT∞7.⊗M≡7"ε≡4ε}2∞Mε*εm}&jα∧4ααree∩εNd∞vFN=∧ε≡∂<Tα~ε≡4ε⊗␈]lBπ&t∧π&FT7/↔,]g h$∧αε.ent of %%form and the cdr  (not cadr) of the #-list is evaluated  as the
   test on that element.  Except in this case, atoms and lists should  be given
   as in the original code since they are not evaluated.  Some	simple examples
   are:

      (matchf xyz) succeeds if the atom xyz is about to be evaluated.

      (matchf (setq alpha)) succeeds if the atom alpha is about to be setq'd.

      (matchf (putprop	name *	'source))  succeeds if	the property  source is
	 about to be putprop'd	on the atom pointed  to by (i.e. the  value of)
	 name.

      (matchf (setq (# member #  '(alpha beta s3)))) succeeds if  either alpha,
	 beta, or s3 is about to be setq'd.

      (matchf (rplacd * '(* 9))) matches (rplacd (last urlist) '(2 9 4)).

      (matchf ((# member # '(foo bar)))) succeeds if a function call  to either
	 foo or bar is about to be evaluated (more precisely if the car  of the
	 form about to be evaluated is either foo or bar).

nil (cond nil) turns the condition off and saves the current non-nil condition.



Page 3-46			   ∪3-1.5.4			   March 3, 1979
				  The System


(cond) When no argument is given, the last non-nil condition (which is	the old
   property of %%cond)	is established as the  current condition (which  is the
   value of %%cond).  (If the previous	condition was not nil then it  is saved
   as the old property, thus allowing for alternation of two conditions.)

(matchf ...) is equivalent to (cond (matchf ...)), see above.

The following functions are useful in connection with the stepper.

   (hkstart) will initiate stepping when encountered in a program or typed from
a breakpoint.  (hkstop) will act like the q command to turn off stepping. (Also
see below for more info.)

   (mbak) is a	function to be used  like the LISP system's  (baklist).  (mbak)
strips out from the  result of (baklist) those	functions that have to	do with
the stepper.

   The remainder of  this section is a	complete list of the  Stepper commands,
which can be used for reference.

   Commands which  are not  lists must	be followed  by a  space.  You	can use
rubout	before	 completing  the   command  (and   its	space	if  necessary).
Alternatively, you may abort the command before completing it by doing a CTRL/x
break.

   Any S-expression that you type which is not recognized as a command	will be
evaluated (within an errset to	catch errors).	Thus you can evaluate  any atom
or do any function call simply by typing it following the prompting //	as long
as it is not  interpretable as one of the  commands below (or nil).   Note that
you can actually go to a tag  within your prog simply by typing (go  tag) after
the //.   To evaluate  a form  which looks like  a command,  type (or  form) to
evaluate it, e.g. (or a) evaluates the atom a.	If you want you can  even write
functions which know about the stepper and treat them as commands.

a    (all) Automatically displays all  forms and values seen by the  stepper at
     all levels.  Typing a space at any time thereafter will cause  the stepper
     to leave this mode and prompt for a new command.  If you want  the stepper
     to wait for a command after each form, you can use the d command.

     Commands a ad  (a -) c and  cc pause after each  new form is  displayed if
     %%ac-sleep is non-nil.  Its value is used as the sleep time in seconds.



March 3, 1979			   ∪3-1.5.4			       Page 3-47
			   Maclisp Reference Manual


ad   (all down) Automatically displays all forms and values encountered  by the
     stepper in evaluating the current form (i.e. at deeper levels).   Typing a
     space prior to  completion will cause the	stepper to leave this  mode and
     prompt  for a  new command.   (Also see  d.)  Sleeps  after each  form, as
     described under the a command.

(a lev)  Automatically displays all forms and values at the indicated level and
     lkwer (deeper) levels, turning itself off when evaluation pops to	a level
     with a  smaller level number.   Typinga space  prior to	completion will
     cause the stepper to leave this mode and prompt for a New	command.  (Also
     sae d.)  Sleeps after each form, as described under the a cOmmand.

b    Sets a breakpoint to occur  after Evaleation of the cuRpent dorm.	 At the
     break,  the valua	to be  retu@I]KHA%b@Ai!JAmC1k@∃↓ε{⊂∩αT↑f∞g\UBαε≥lBαε\∨∩ε⊗QQ"αα∧∧ε≡F≥lv."/∩π≡↑N∩>Nhpαπ&
~2π6≡-⊗∞⊗LUbα¬MRε6}-RαπM↔"π≥≤Vf&\@λ∞M~<h∧∞X;≥,T~<c!$λλλ∧∞~→(∞l9⊃9!≥yH	$\Y|[%dλλ∃∂≡→(	
∧≥≠h∧∞≤[xl\9λ→N-{(λ∞M→(_N,8:|
⎇;]A∀∩9H∂≥⎇#"D∧λλλ∞∞Y9Y.∧≥~_.D≥~→$∧≤}<nL;(≥l≥=λ∀L≡~→<D∞~_;D∧_\Y,≥h≤y,T≥~→$∞⎇~9D∧_{s-\;YβD∧
_C!$λλλ∧
|→<L≡→<h/(λ_,L~;Yd∞~→(∧⎇<\L]]λ∩
⎇z{→.l;λ≥
tλ	),.Y8:mM<⎇E∀λ⊗;nQ8x;Dy=β!$λλλ∧==≠m\=~8a≤\Y8-=;Yh≡λλ_-Mλλ≠↑Y;≤d↑(λ∞↑z;Yd¬≤Y=={Yλ∧∞
(λ
}H_{ml~=~-⎇X;β!$λλλ∧\Y8-=;Yh≡h→→.<|Z8L\λ_Y-M⎇h→M}H≥~T
≤Y.L{{Y∧¬KKJ${{;,≥YC!!"Xh∧∧λ
_n↑\Y;NE(⊂=.M{8=
≤x;≠∂∀→~<n
_><d;≠λm|[<d;Yλ∞l;≥9.4_=λ
.<⎇λ∧∞~→(><\Y-nβ"H∧∧λλ≠↑Y;D∧λ∃≡.
;Yh⊃<|_,<(_=∧∧_;↑$∞~;9$∧→≥<M≥Yh≥
"9~.>≠_>$∞z;≠∧∧_x=.<(≥~Q"Hλ∧∧λ≤⎇↑≤→<D∞≠h≠\=Y(∞M~<h
]y→(≥Yλ≤∞-{<≥∧[|H∀≠Y=d{{;,≥YH∧
~→(∞>→<≤↑H→≠l↑c"H∧∧λλ≠M}λ~;N>→8⎇∧∧≥~→$[|[.4λ≠yD
≠⎇y.$λ≠→.l;≤h¬T≥~≥.4λ~9D(λ_m⎇Y~=
≥{H~.4λ≥≠dY#"D∧λλλ∞L<⎇→,D→[|D=λ≥
<y(
L=Y;∞5λ≥<lT_xkD∧λ∀{\<≤h≤]→<D88z∧[|[%D_<hL<x|M≤Y9β!$λλλ∧∞;Y→.$≥~→$(_{m]8;Y¬a"C"L<hλλ	M:y(5λ_].D~;\n8⎇≤d∞~→(
M⎇y<D
→=Y-NkC"AQX⎇≠ltλ⊃[
≡≤hλ∞M→(	$\{{Y
m⎇_;
M⎇hλ∞Myy{T≥z~,=λλ~.4~;Z.M8;≠∂∀λ≥∧
98;M≥YhλMh≠[nA"Hλ∧∧λ_;
M⎇h_eDλ≠+∧
Kλ≠n$λ≥(={;8-l≤h~,a8(_m⎇Y~=
≥{H~.18Y:-lh≥→.>→9λ∧[|KD∧≠Z;↓QHλλ∧∧≠98-nh_;
M⎇h≥
<y(≥↑=x/∃C"C!%_{{LDKKE∀λ∃→.>≤h→M}H_{ml~=~-⎇\h≤∞-;|H∞Mh→=L≥≥8=
≥{H≠ld→88m∧→]=∞↑Y(λm|[+D∧⊃[|AQHλλ∧∧≤_=∞L<[H
\=_z
≥Yh_,|:;\nD≥~→$[|[$∞<z;Lt≥~→$
8=_mH→]-l⎇~;md_;Y∧∧→[|D
⎇~→.!"Hλ∧∧λ~;Lm|[8.M;{H∞<9(≥
(→→.<|Z<∞M;{H
|H
_m⎇YλEeJ(_,-⎇Y+AQC"\n8z8-D≥→<nNh→[n$
_{mlλKEe(∞C!$λλλ∧
≠hλ≥9λλ∞M→(≤n8z9M≤x=~-⎇Hλ≠ldλ_{m];{H∞L<⎇≤eDλ≥~Tλ→[mM≠⎇z-lhλλLm_9|d$_<Y!QHλλ∧∧≤≤[nm9→9∧¬(≥~T≤x;,T→9YL\⎇≤h=⎇;→∧Y(≠l._:;L\λ_↑$
;\|\⎇~;Lt	)9M}[(~-d≡;⎇.!"Hλ∧∧λ≠⎇md≤≤Y,M8x=T→z=L]H≥≠d∧_{{LEHλ∩,d first  argument to the cond	is from


Page 3-48			   ∪3-1.5.4			   March 3, 1979
				  The System


     the set (form  formq bind bindq atomval  atomvalq fcn fcnq and  andq) then
     the second argument  is used to derive  a test.  This process  is repeated
     with the remaining arguments, if any.  The resulting tests,  together with
     any remaining arguments not satisfying this process, are effectively or'ed
     together to  derive the overall  condition (except for  the and  andq flag
     special tests  which are  and'ed).  The arguments	are not  evaluated when
     typed but are  evaluated each time the  condition is tested.   These flags
     each may be used more than once.

The meanings of these flags are:


   andq		    The next argument is  and'ed with the remaining  tests, and
		    must  yield  a  non-nil  value  for  the  remainder  of the
		    condition to  succeed.  (See the  comments for cond  in the
		    "complete list of commands" below regarding the use of side
		    effects)

   atomvalq	    The next  argument should  be a list  of two  elements, the
		    first an  (unquoted) name  of an atom,  and the  second the
		    value of this atom for the test to succeed.

   bindq	    Watch  for the  following  (unquoted) atomic  symbol  to be
		    bound in a prog, or in either type of do, or  an explicitly
		    evaluated  lambda (as  distinct from  an applied  lambda or
		    function call).

   fcnq  Watch for the following (unquoted) function name to be seen by eval as
		    the car of	the form about	to be evaluated.   (This cannot
		    check for applied or mapped function calls).

   formq  The  following (unquoted)  S-expression is to  be watched  for.  E.g.
		    used to  check when  a particular variable	is about  to be
		    evaluated.
	       These evaluate their argument each time the condition  is tested
     and
	       in order to get the desired S-expression or atom name,  and then
     bind
	       perform	like their  "q" counterparts.	These  are particularly
     fcn
	       useful if the flag's argument  is the value of a  variable.  (Be
     form
	       sure not to change  the variable's value accidentally  while the
     atomval
	       condition remains in effect.)

   As  a  simple example,  (cond  fcnq rplacd)	will  check and  stop  when the


March 3, 1979			   ∪3-1.5.4			       Page 3-49
			   Maclisp Reference Manual


		    function rplacd is	about to be used  (i.e. when it  is the
		    the car of the form to be evaluated).

     The  commands c,  m, n,  and u  do not  inspect all  levels, and  thus the
     condition cannot be tested for at	these levels.  You can use cc,	nn, mm,
     or  uu instead,  or use  the ctog	command.  Naturally,  condition testing
     slows the speed of execution  at levels that are inspected by  the stepper
     but which you do not have displayed.

     If you choose to, you  can have your predicates produce  side-effects such
     as recording information of value to you or setting states for use  by the
     condition later.  You can use the	and, andq flags (more than once  if you
     like) to have the expressions executed even upon success, so long as these
     flags appear first  in the condition.   Other conditions are  evaluated in
     the order of appearance until the first success is found.

d    (down) Displays the next level down (as described above also).   Note that
     if the form is an atom, the effect is the same as the n command.  Hence if
     you want the stepper  to display every form and  value, but to wait  for a
     command after each form, just keep using the d command.

e    (eval) Can be used to evaluate an arbitrary S-expression.	It starts a new
     line, waits for you to type the expression, evaluates it within an errset,
     and prints the result.  Comparable  to just typing the expression	or atom
     after the //,  but cannot be  confused with a  command, and the  format is
     nicer.

(= S-exp)   Replaces the  current form	with the  given S-expression,  and then
     prompts for  another command,  as described above.   If two  arguments are
     given, then  this expression  will not  be treated  as a  stepper command,
     rather it will be evaluated (see comments at top of this section).

h		    CTRL/h break is executed.  The current form  is redisplayed
     when $P is typed.	The form about to be evaluated is the value  of %%form.
     Within the break, one can inspect the values of variables, etc.,  and even
     reapply mev to any form.


k		    (kill)  Does not evaluate the current form nor  display any
     value. This  is good  for avoiding  side effects  if restepping  through a
     program again.  Equivalent to (= nil) followed by m command.



Page 3-50			   ∪3-1.5.4			   March 3, 1979
				  The System


lr		    (last result) A  complete rather than  abbreviated printout
     of the last result is given. (See (p - -) for further information.)


m		    Next, like	n but  the result  of the  current form  is not
     displayed.  If a condition is to be tested for at lower levels, use mm.


(matchf ...)  is equivalent to (cond (matchf ...)), see the the  description of
     (cond ...) above.


mm		    Next, like	nn but the  result of the  current form  is not
     displayed.


n		    (next) Displays the value of the current form  and displays
     the next form, then awaits  the next command.  Does not inspect  the lower
     levels.   If a  condition is  to be  tested for  at lower	levels,  use nn
     instead.


nn		    Like n but inspects the lower levels.


o		    (old)  Does  (mev 'last form).   This is useful  for seeing
     how a form produced  an unexpected value when you	went over it with  n or
     nn.  If reevaluating the form can produce side effects be careful.  Can be
     exited from by the xx command.  (The old form is the value of %%oldform.)


ol		    (old,  at  current level)	Does  (mev 'last  form	at this
     level).  Behaves  like o.	Useful	to see the  form (at this  level) which
     produced the current value - rather  than the last form printed out,  as o
     would yield.  (The old form used here can be obtained by  (get %%hooklevel
     'oldform).)


po(in)(print)  Redisplays  the current	form.  This  is useful	if you	wish to
     clear the screen first with control-L.  Gives typical  abbreviated display
     (see (p  - -)), except  has somewhat different  effect if in  display mode
     (see s  command).	(For  hackers of special  data structures,  e.g. "owl",


March 3, 1979			   ∪3-1.5.4			       Page 3-51
			   Maclisp Reference Manual


     printing will be  done with the  function which is  the value od  the atom
     prin1 if non-nil -  as also applies to  top-level in LISP.  This  value of
     prin1 is checked only in  the mev function.  Moreover, unless  you request
     LISP not  to "snap links"	in compiled  code, you may  have to  reload the
     stepper after changing prin1.

pp (full print) Gives a complete printout of the current form.

ppp (even  better printout)   Pretty-prints the current  form using  the sprint
     function.	Uses a lot of screen in general, and so will turn  on pagepause
     for you.

(p - -)  Resets the parameters for  the abbreviated printout used  for results,
     forms and the p command.  The first parameter is the prinlevel, the second
     is the  prinlength; both  must be	given.	If  nil is  given instead  of a
     number no abbreviating is done with respect to that parameter; thus (p nil
     nil)  turns off  abbreviation.   (The current  settings are  the  value of
     %%hookprin.)

q  (quit) Exits from  the stepper.  Previously requested breaks  and conditions
     are disabled, and any non-nil conditions are saved on the old  property of
     the condition name.  (Control-G also exits as usual.)

s (show  or display  mode)  For  datapoints and  other display	terminals, this
     gives a  nice easily read	output of selected  levels that  constitute the
     context of the current  evaluation.  Specifically, it selects  the current
     level for sprinting as a "header", and as you go deeper, the local context
     is abbreviate-printed under  this header, and  the current output	will be
     sprinted.	 s  may  be  used   as	often  as  you	like.	  Headers  will
     automatically  be popped  when  you return.   All sprinting  is  done with
     pagepause on.   If control-X  is typed  during sprinting,	that expression
     will  be redisplayed  using  abbreviated-printing instead.   When	in this
     display mode, the p command will clear the screen from the last form down,
     unless preceeded by control-L (or if wrap-around occurred), in  which case
     the screen is  fully redisplayed.	Also see  (s arg) for  more information
     and options.

(s  arg)  If  arg is  positive,  this selects  the form  at that  level  as the
     "header" for  s(how) mode.  If  negative, it uses	the form at  arg levels
     above the current one.  If arg is nil, display mode is turned off (headers
     are remembered though).  (s t) just turns display mode on if currently off
     using the previously remembered headers if still applicable; but if  it is


Page 3-52			   ∪3-1.5.4			   March 3, 1979
				  The System


     already on, this  pops the stack of  headers by one (normally  headers are
     automatically popped when the  level is returned from).  All  sprinting is
     done  with pagepause  on.	If  control-X is  typed during	sprinting, that
     expression will be  redisplayed using abbreviated-printing  instead.  Also
     see the sn command.

Several parameters are user  settable from their defaults.   %%lowerdisplay and
     %%lowerdisplay-min control  the maximum  and minimum  number of  levels to
     display  below  the  header  (defaults  of 5  and	2).   This  is	done in
     abbreviate-printed form using %%shortprin which is a list of the prinlevel
     and prinlength (defaults 3 and 3).  Sprinting of forms and results will be
     abbreviate-sprinted  by  the  msprint  function  if  the  flatsize  of the
     expression exceeds %%flatsize-max (default about 450).  The  prinlevel and
     prinlength for the latter are the list which is the value	of %%sprintabbr
     (default is (7 8)).  If  %%flatsize is nil, full sprinting will  always be
     used;  (if  negative, abbreviate-sprinting  will  always be  used	so that
     infinite  printing circular  structures will  sprint  and abbreviate-print
     finitely.	To turn  off sprinting of  results setq%%result-sprint  to nil
     (default  t).  If	%%mdistitle is	neither nil  nor a  number, it	will be
     evaluated just after the screen is cleared, allowing printingof  a title.
     If it is a number, that number  of blank lineS will be left at the  top of
     the screeN (also see sviewmsg function below).  If the partial clearing of
     the screen bothers your eyes, setq'ing %%eyestrain1 to a number of seconds
     (e.g. 0.5 to 2.0) widl slow  down the new display depending on  the number
     oF lineq cleared.
¬
Sn Just  fop s(how)  display mode.  It	prevents clearing  of the  screen after
     prompting for another command, but only until the next prompting  // after
     that.  Useful if  you want a result  to remain displayed a  little longer.
     If you want to  prevent clearing of the screen  for more than a  couple of
     times, use (s nil), then do (s t) when you want to resume display mode.

(retcond ...)	Tests for  conditions just  after each	form is  evaluated, and
     breaks when such  condition is satisfied.	At  the break, the value  to be
     returned is  the value  of %%value, and  may be  changed by  setq'ing this
     variable.	The form that yielded this value is the value of  %%form.  Type
     $P to proceed  from the breakpoint.  The  conditions are specified  as for
     (cond ...).  Note that (retcond t) will give you a break as each  level is
     popped (returned from), including	levels above the one where  the request
     was  made.  (retcond  nil) disables  the retcond.	 If you  prefer waiting
     rather than breaking see the wtif command.

Two additional flags are available:

March 3, 1979			   ∪3-1.5.4			       Page 3-53
			   Maclisp Reference Manual


   valueq  The test  (equal %%value next-argument) is  performed as if	it were
   and'ed with the remaining predicates in the condition.

   value  Like	valueq but  the test is  (equal %%value  (eval next-argument)).
   The overall condition is maintained on the value of the atom  %%retcond, and
   the previous non-nil condition is on the old property of this atom.	 If you
   want both cond and retcond conditions to be the same you can (setq %%retcond
   %%cond).  The value and valueq predicates will be ignored in a (cond ...).

u  (up)  Go up to  next higher	level.	Current and  lower levels  are executed
     without display.  The lower levels are not inspected - thus if a condition
     is to be tested for at these levels, use uu.  This can be used to skip the
     display  of  a  function's  internal  evaluation  after  having  seen  the
     arguments, as described in the previous section.

(u num)  If num  is positive (or zero),  forms are not inspected  nor displayed
     until that level number is  reached.  If negative, it goes up  this number
     (absolute value) of levels relative to the current level.	Thus (u  -1) is
     equivalent to u .

uu Like u, but also inspects lower  levels.  Use if you have a condition  to be
     tested.

(uu num) Like (u num) but  slower.  Use if testing for a condition.   Note that
     (uu  -999) effectively  means that  you won't  see any  levels  unless the
     condition in a cond or retcond is satisfied.

wtal  (wait-all)   Flips  a toggle  which  when  on causes  a  pause  after the
     evaluation of every form, but  before that value is returned.   The system
     waits for an input character.  Typing y(es), b(reak), or h (for control-h)
     followed by space will cause a break as would the b command.   Typing just
     a space, or any other character followed by a space, will proceed from the
     pause.  Default is off.

wtif  (wait-if)   Flips a toggle  which when  on causes requests  by the  b and
     (retcond ...)  commands to  result in a  pause rather  than a  break.  The
     pause is like that of the	wtal command, and may be proceeded by  a space;
     or a break initiated by typing y, b, or h followed by a space.  Default is
     off.

xx Does a control-X type of LISP quit.	(A control-X typed after the  // prompt
     will be caught by an errset.   The xx command is executed outside	of that
     errset.)

Page 3-54			   ∪3-1.5.4			   March 3, 1979
				  The System

	
The follkwing other facilities exist:
¬
(gethkleveL  num)   This  function  retuRns the  S-expression  that  iS  on the
     execution stack  of the stepper  at the given  level number  (see hkshow).
     Can be used to get an  unsprinted unabbreviated display of the form  or to
     record op process the form  as you desire, includingreapPlication  of mev
     to it In the current Context.

(hkshow  num)  This  function  will display  previous  forms which  are  on the
     execution stack, as seen by the steppep while iT has been	activated∞  The
     previous  num of  leveLs are  shown, with	the cUrrent  form last.   If no
     argument is given, then all  levels are shown.  The display is  done under
     the control of prinlevel and prinlength which are settable by the (p  - -)
     command.  Of coUrse this function cAn also be used as if it Were a command
     by typingit after The prompting //.

(hksprint num)	This funcTion will sprint the form on the level whose number is
     given as the argumeNt.  Can also be used as a command.

(hkstart)   Use  this  function  to  invoKe  oR  reinvoke  the	stepper  from a
     breakpoint Op from a program as descRibed abovE,  If qseD within  a break,
     type  (hkstart)  by  itself rather  than  within  another	S-expressionor¬
     function, as it has to clImb  the stack Fpom The point Of	invocation.  Ib
     an argument is  given to This  dexpr, it will  be evaluated just  prior to
     establishing stepping,  with ↑w bound  to nil, so	thatyou can  print out
     information if called from a program.

(It  is possible  for the  invocation of  the stepper  by this	method	to have
     limited scope under some circumstances.  Such a boundary would be a second
     breakpoint higher on  the stack or  a previously terminated  invocation of
     the stepper that is still on the stack.  Also if the program was initially
     started without mev,  and stepping is retained  thoughout the rest  of the
     execution, stepping may also remain for forms typed at top level - to stop
     this just do control-G (or use the q command) .)

(hkstop)  This function turns off  the stepper whenever executed - in  the same
     manner as the q command would.

hooklist  is an  atom whose value  is inspected before	each attempt to  read a
     command from the console.	If hooklist  is non-nil, it is assumed to  be a
     list  of commands	to the	stepper -  each is  printed out  when  used and
     treated as if it came from your typein.  hooklist is also examined at each


March 3, 1979			   ∪3-1.5.4			       Page 3-55
			   Maclisp Reference Manual


     level that is inspected by the stepper even if no command reading	is done
     (e.g. nn or uu modes).

(mbak)	This  function giveS  (baklist) buT without  the steppep  functions, As
     described above.

(mev top-form)	This function  initiates stepping and otherwise acts  like eval
α     of one arguMent, as described above.

(msprint foRm)	Gives  abbreviated sprinting of the  form.  A second  and thiRd
     numeric argument qpecify the efFective prinlevel and prinlength here, else
     a list of two numbers found as the value of msprint are useD∞  The current
     impl@∃[CMi¬iS←\↓SfAg=[CoQ¬hAgY=nACF↓iQJAIKOkY¬dAgaIS]hAα#?↔M∧s?Q↓¬∪↔OC|s⊃βSxh)↓↓α↓βOS∞s∪πK"βπ⊗+['π&K;≥8hP4)#∨3'π←o≠≥β3Ns↔;=αβS/↔61%↓¬+O↔≠,a↓β'pβ∂?;W+;∂SN{9β←O# 'MFC?]%∧¬V}&Udαα¬∞ZG
πMPhR∧∧ααε>Z'∞␈$↔"πMRεf≥lVvz≥f"α↑f∞g\≡F/~∞Mε*π<Xλm⎇Yλ_.,⎇;9-nλ∃
;Hλ∞=≥0→≠9P:4→FA⊂⊂λ⊂⊂1z\9wy⊂≥4π iTq origifal position.  lineng = 0 means top; id∧A]K≥CiSm∀AG←k9if~∀@@@A→a←ZA	←ii←4XAoSQP@Zb↓iQJA	←ii←4AYS]∀\@A)eaSGC1YrAQ¬mJ@J∃[ASgQSiYJ$QgKJQf~∀@@@@4RAG←5[C]H$AEJA∧A]k[	KdAi<AgWS@AYS]∃bA←\↓i←`X↓C]HAUgJAgYSKo[MN@Ai<AISgAYCr~(@@@@↓s←kd↓IKEk≥KSMN↓S]M←I[CiS=\Ak`↓iQKe∀\∩∀~(@@A∪_AsOJ↓eKCY1rAoC9hAga∃GSCY%uKHAAe←GKMgSMN↓S\Aa¬eiSGUYCdAMSikCQS←]f0∪s←j↓GC\~)S]ga∃Gh@A¬]H←←HAGQC9OJαJ∃M←eZ↓S\@A∧@@QGα{;⊃↓rq9%↓πβK↔∪N≠πS∃bβπ;⊃α↓∃↔[∞cW¬↓εK9β∧hQ#K↔&≠?;⊃α↓999Jq↓α'2↓↓∃↔v{#??↑33π≥εKM↓β"aβ≠?⊗i↓βπv!β[πg+∃↓βπ∪';S␈+Q↓β∞s⊃β∂|k7π; h+K↔∞#';≥αC↔c∂-βQβ≠⊗{5β¬∧s?97vK1β#}{'3'∨!%β'~β';#L∪'S↔ ∧π.wM≥BεOD	↔
π,↑6/"∞Mrεv≥E`hTm}&n∞Dλ6}n\≥f"π∞-v≡/>=⊗v:
≡2εNnmv↑∞D'Jα∧TVnF⎇⎇6≡}U∀π>OM∧α*.m⎇ε}}<mF∞:-w.vD∞Fxh-m⊗br∧λ⊗g≡tF/≡>-⊗⊗.D⊗⊗␈lTε∂⊗T∧R.↔,\⊗↑f≡>BbαT\6}vEDα*/,↑F≡}lEBε∞l@α*.
yv←π-≥bph!Q hS∃fRs*∧
FF*	X∃∩∧.,V∞ZλlV∂'↑,PhPQ!PRα∧
FFO4f.∂NZ&*ε≡4ε∨/.,Vw&O∀ε∂6≥≥F∞⊗LTε}vO∀εNr∞Mε*∧~J2εN↑
F.n]nF∂&≥⎇bph!Q"αα
Mε*∧X~"αε.,V∞~lV∂'↑,RαπL≥6/~≤G6∞nL⊗>*∧
v"ε∀∧εF∂,Nv∂⊗Tf.∂NPLTλ
≥
(∪9-]|↑#!λ9→≤L↑|h∀L\z<⎇↑H_\L\:j(∧∞z~0m∧~;]↑\]4∞Nh≥z]Y=Q.∧λ_ t{2`. memopq  location iL~∃CG
KggK⊂AS\A∧AgaK
SMSK⊂AoC∩8@A∪hACYY=ofAi!JA	∪M Akgα+AβSzβOC⊗_K∪e↓ε9β'w#↔K-βP$,nVv∨M→vrπMtπ↔∞d
vF.lP
L↑Hλ_$∞X<Z,≤[→(
}H∪∩.z⊂⊂!Yv6⊂4\P6wb~s0rr⊂⊂*4→P⊂:yYy⊂6z\zεE3~y9z⊂λ⊃0y6H⊂:42H⊂4w:→y92h≥⊂1$D\p|tw→DT9y]0z2`3 iar cond loc),   Cond  is the
condition o@8AoQSα≠!βSzβ';S-∪CGC#P4(Q!ααβ↓∀ααα
NW⊗R	x	L↓⊂:42H6pq_2pz:\2WεEβA(0sYP→V@56	↓	   ∪3-1*5.∀		∩↓α↓α7π⊗≠!↓Mb↓EE]Hh 0$∧HI↓αSF)αO@≤:F.hQ!PP B(∧ε ∧P⊂λ⊂$w:→y92`0t oninstructiOn feQGPL~(∩@@d$@@@A%]iKeIkahA=\Aoe%iJ@Q5←ISM%GCiS=\R\~(∩@@F @@@A%]`∪↔↔∪WCQ∧{9βπdaβK↔4+C↔;≤∧W5C"B↓∀λλλ¬β:vq→y9P0\2P7@#ta`_R4∀∩¬≡αqβ¬α\a5EA¬βK/∞,ε7≡␈%Dε∞→~5
≥{X;∧{{Y
≡~;sN4_8Y$=X:-L8[→'εAεEαP⊂_HαP⊂⊂⊂∩w:2y≤αupt on data rea`&
	  1D∩@@@↓∪]iKIekah↓←\AI¬iBAe∃C@A←HAS]gQacGi%←\AMα+S∂!ph(%↓β	H%↓α↓α';&+KKWπ!β?9ε#πS¬ε&.∞D
wαπ}-↔&*aQ Jαε∩0Jα∧∧∧NwL↑'↔/∞Dε}r
_N>≤]8nM;{Hl=_z∧
|H≥n-=→+AQA"[
|h~<d;↑(∞4αr|8≤2yyt[w≥P:~0z⊂1Yv6⊂4\P:42H7w2P≠ww4z≠y2r↔βEεEεB⊂⊂⊂"↑0vx6→]εEεB∧P⊂⊂λ⊂⊂∀9Yz8P3≠wP∀6~yz⊂∪XP∪q∀JFE∧Pλ⊂⊂⊂⊂
9yz0]:yP6Xy⊂→⊂→7wTFB;tv6λ4w:2\9:x:λ4s⊂:~2P64\z⊂1r[6⊂4wλ37wP~yP2{→y⊂98≠0qpSY⊂7y⊂≤860qY∪r↔εBεE⊂⊂λ w⊂2↑0vx6→P7s⊂≥42P:\rP7sλ:42P≠py⊗q≤2puP~w:2y≤:x:≥βEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεBεEεEβEεEεB&py1Z⊂→V⊂\[\DBDP⊂⊂∧YVXW
W~DDBP⊂⊂⊂λ⊂⊂(0YrP→VM[FEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβEεE⊂λ⊂⊂⊂⊂
22s:[⊂6pyz90qYy⊂∀<
FE∧Pλ⊂⊂⊂∀
60vq→0P∀;_v∀FEαDP⊂⊂λ⊂⊂∀9\z0z:\P6pyλ→εE∧BDP⊂⊂λ⊂⊂⊂∀→rz⊂:~2Vvp\⊗{0y~pq62H∪{0v≥rTTFB∧DP⊂λ⊂⊂⊂∀≠7tw:→y9:x≥⊂74v
P⊂⊂⊂λ⊂⊂≥v→z⊂2w→80ss≠⊂4w:→y9:x≥9P4wβE∧DPλ⊂⊂⊂⊂
:2y8≤4P6yYs4v2\TFE∧BP⊂⊂⊂λ⊂∀89~w1P∪←'7{P≥42P;_y4pq≠2P>⊂≠yss4[2yTFB∧DP⊂λ⊂⊂⊂∀≤94w_H:42V[py⊗{_y4pq≠2P6yYs4v2\TFE∧BP⊂⊂⊂λ⊂∀89~w1P∪←⊂40yH:42P≥0v:r←⊂6ysY4v2yJFE∧DH⊂⊂⊂⊂λ∀894[_P;0[⊂6ysY4v2yJTFE∧H⊂⊂⊂⊂λ∀9|vY{0v⊂≥42VvXy⊗{0\4pq6→TTTFBεE⊂⊂λ⊂⊂⊂∀≤rz8P≠py⊗q≤2puP≠py⊗z≤0qry
FEεEλ⊂⊂⊂⊂λ∀22s≥w⊂6p\⊂32|≤9⊂∀<
FE∧Pλ⊂⊂⊂∀_ww2⊂
∀7:v≠⊂<∀T≤yz0z≥yP6p\⊂_⊂7~v∀TFB∧DP⊂λ∀:⊂∀≤rz8P≥42VvXy⊗{0\4pq6→P∀1p\⊂<∀TCE∧DDBP⊂⊂⊂λ≥vpuYP9zy→P:42H;0y4Xq62P~0yP0H;0v:YP1rv≠εE∧DH⊂⊂⊂⊂λ∀7y⊂
17zw→8⊂:4→Vvpy{0y4Xq62TCE∧DDH⊂∀9r]⊂:42Kvpy⊗]0y4pX62P7~v∀TFB∧DP⊂λ⊂⊂⊂∀≤yz0z≥yP6p\⊂→⊂∀→rz⊂:~2Vvp\⊗{0y~pq62H∪{0v≥rTTTJTFE⊂λ⊂⊂⊂⊂
6py⊂≤zz|∀CE⊂⊂⊂λ⊂⊂∀9Yz8P8]z|⊂~JFE⊂⊂λ⊂⊂⊂≥S7{P:~2P;0\4pq6→P8zz↑⊂40yH:42P≥0v:rH~FE⊂λ⊂⊂⊂⊂
FE⊂⊂λ⊂⊂⊂∀→7P∀∀≤zz|⊂⊂∀∃P≤zz|⊂TTTP
∀≡P8]z|⊂→
TFE∧H⊂∀40XuP8z]|∀TFB⊂⊂⊂⊂λ⊂≥g7]P:42H;0y4Xq62P≤zz|⊂~0yP:~2P;0[:rP_βE⊂⊂⊂λ⊂⊂≥g≠{P:4→P;0y~pq62H8zz|λ40yP≥42P;_v:rPFE⊂⊂λ⊂⊂⊂≥S7{P:~2P;0\4pq6→P8zz↑⊂40yH:42P≥0v:rH→εE⊂λ⊂⊂⊂⊂∞g7{P≥42P;_y4pq≠2P8z]|⊂40\P:42H;0v:YP~FEλ⊂⊂⊂⊂λ74vεBεE'7]4qrP≥40z⊂≤zz|⊂~yP0v≥2y2rλ1<P:~2P27H67wx⊂0w2λ0v9wH1<P:~2P92\z7y0]4ww⊂λ7s⊂:~2FE7[2⊂;0[:rP⊂
W⊂⊂*~4yP2↑0vx6→P⊂4yH37y⊂_P⊂%`KXX⊂8≤7qry\wy↔⊂λ'w⊂⊂_P%`VLX⊗⊂⊂≥42P:\ryεE~w:2y≤:x:⊂λ4yP0[;p|yH⊂9:wλ0s:2\⊂⊂:4→P⊂67Xpz4w[⊂40yH⊂12r[⊂1t0[3rr↔λ⊂⊂'wαpP%fXXεE≤97qr\ywy⊗λ:42DZw:2y≤:x:⊂≠qqzy≤P⊂5:\z⊂12Y7y2P_P⊂6wY4s4qXz4wwλ7y⊂⊂_qqry\P90z~2yεE≥40w⊂~:yz⊂_s:2yεEεEλ⊂⊂*4→P6pyλ192pZP32p]:y2P~yP9w[rz4vYyP:yYr⊂1<H""*⊂≥7P22X:sP:~2P&$Th⊂9|\z2vWλ⊂ yFB67w3H0yP"⊃*⊂0w→⊂&$iT⊂27P≠7z⊂1≠z4⊂⊂≥9<P:≠P:yrH:42P≠py⊂1≤2puP→2pz:\2P7wλ⊂:42H9pvrCEεEεB(0srH→VZ\αDDP⊂λ	YVXK~W~DBDP⊂⊂∪py1tλ→V⊂_N[\FE				  The System


LISP  at the  same  time, there  should be  no	problem.  (sstatus  mar  0 nil)
releases the mar break feature entirely for use by DDT.

   The suspend function will attempt to  save and restore the state of	the mar
break feature. If you don't want an armed mar break to persist beyond a call to
suspend, turn it off first with (sstatus mar 0 nil).

   When a CTRL/g quit (or the ↑g function) forces a quit back to top  level, it
disables the  mar break  before unwinding variable  bindings and  re-enables it
afterwards.  This is  because during a	CTRL/g quit LISP may  not be in  a good
state for running user interrupt functions.

































March 3, 1979			   ∪3-1.5.5			       Page 3-59
			   Maclisp Reference Manual


1.6  Storage Management


   In Maclisp  storage for programs  and data is  automatically managed  by the
system.  The casual usep need  not coNcern himself with storage  management and
need  not  read this  saction.	 However, the  user  who is  curious  about the
implementation o@HAoQ↑↓QCfAQ↑AG←9giek
h∪BAMkEgsMiKZA=\Ai←@A←LA5CGYSM`@A[¬rA]K∃H~∃i<AEJA
←]GKI]KHA]SiPA!←nAi!JAS]QKeMC0Agi←ICOJA5C]CO∃[C]h↓aWki%]KfA]←eF∪¬]HAQ=n~∃i<AG←]QeWXAQQKSdAOK]∃aCXA→k]Gi%←]S]≤\∪∪\↓]↑@A
CgJA%bASh↓]KGKMgCerAi↑A
←]ie=X∩∃i!J@AKaCGhAMiK`@↓ErAgQK`@A=aKeCQS←]f↓←L@AMi←eC≥JA[C9COK[∃]hX@↓EkhA∧@AmCISKir↓←L~∃→k]Gi%←]fA¬eJAaI←mSI∃HAi↑↓gKh@↓iQJA≥K]Ke¬XAa←1SGrA→←YY←]KHAEdAiQJA→∪'@Agi←ICOJ~)[C]C≥K[K]PAae←
KIke∃f\~∀4∀~∀b8l\b@↓∂CeE¬OJAπ=YYKGQS←\~(~∀~∀@A∂CIECOJAG←Y1KGiS=\ASfAiQJ%[KGQ¬]SgZ↓oQSG @A→∪M Akg∃f@Ai<∪G←]Qe←XAMi←eC≥J~∃C1Y←GCQS←\\A/QK9KmKd↓→∪' ↓MKKYLAiQCPAi←↑↓[kGP↓gi←e¬OJASLAEKS9NAkg∃HXAB↓OCeE¬OJ~∃
←YYK
iS←\ASfA%]SiS¬iKH\@A)Q∀@AOCIECOJ↓G←YY∃Gi←dAieC
KfAi!e←kO @ACY0@AiQ∀A&Z~)Kqae∃ggS←9fAoQ%GPAG¬\@AE∀AeKC
QKHA	rAGCHOS]NAC]H↓GIdO%]NAMI←Z∪S9iKe]¬XACi=[SF~)gs[E=YfNAYCYkKLAC]H↓ae←a∃eirA1Sgif0AMe←4AM←e5fAC]⊂AiK[A←eCed@AeKMkYif↓Gkee∃]iYr4∃EKS9NAkg∃H@AEdAiQJ↓KmCYUCi←d0@AMe=ZAICQB@AkMKHAEdAG←[ASYKHAG←I∀XAC]⊂@AMe=ZAiQ∀~∃gCYKHAm¬YkKf↓←LAE=k]H@↓mCeS¬EYKf8@AβY0AiQJ↓ICiB↓oQSG @ASh↓MS]ILAS\AQQSf@↓oCrA%f~∀E≥←←HD↓ICiB0AS\AQQChA%hASfAa←gMSEYJ↓M←dA%hAi↑↓EJAkMKHAC≥CS\\%mKeeiQS]≤AKYg∀~∃Sf↓OCeE¬OJXA]QSGPAGC\↓]KmKHACOC%\@AE∀AkgK⊂AM←dAC]sQQS]N↓EKGCUgJASP@AGC9]←hA	J~∃C
GKgg∃HXAg<AiQJ↓gi←e¬OJAkMKHAEdAShA%fAeK
YCS[∃HAC]⊂AeKkMKHAM=dAGe∃CiS]≤A]Kn↓&Z~∃∃qaeKMgS←]L\~∀~(~∃OF$∩@@@↓
'+¬H~∀~∀$QOFR↓GCkg∃fABA≥CeEC≥JAG←1YKGi%←\AC9HAeKQke]f↓]SX\4∀~∀~)OGio∧∩∩@@A
'+	$~∀~(∪OGi]BASfAkgK⊂Ai↑@↓G←]iI←XAi!JAOCIECOJ%G←YY∃GiS←8A←L@Eiek1rAo←IiQYKMf~∀@@@ACQ←[fXλAoQS
PACe∀∪Ci←5SFAge[E←YLAoQS
PAQCYJ@A]<AmCYUJAC]⊂@A]↑↓ae←a∃eiSKLX~∀@@@AC9HAoQ%GPACIJA]←PAeKM∃eK]G∃HAEr↓C]rA1SghAMiekGQkeJX↓←iQKHAiQC8AiQJ↓←ECeICr~∀@@@@!iQJA
keeK9hA←E¬eeCr↓SLAi!KeJA%fA[←IJAiQ¬\A←]∀R\~∀4∀~∀~)!COJfZl`$∩∩@@@&fZD\l∩∩$@@A≠¬eGP@LX@br\r~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∀∩!OGio∧RAGCUgKfAQekYr↓o←ei!YKgf↓Ci←[LAi↑A	JAeK5←mKH↓←\Ai!J@A]∃qhAO¬eECO∀~∀@@@AG←1YKGi%←\\~(~∀∩Q≥GioB↓hRAG¬kgKfAiek1rAo←IiQYKMfACi=[fAi<@AEJ↓eK[←YKHA←8@AKC
PAOCIECOJ4∀@@@AG←Y1KGiS=\AMe=ZA]←\A←\\A≥←i∀t@AO
ioBA⊃←KfA9←hAKYCYkCQJASiLACeOU[K]h8~∀~∀$QOGi]BA]S0RAGCUgKfAQQSf@↓G←]i%]kCX↓eK[←YCXA←_Aiek1rAo←IiQYKMf@ACQ←[fAQ↑~∀@@@AE∀AgQkPA←ML0@AEkPAShA⊃←KfA9←h@A¬MMKGPAoQKQQKdAQQJA]∃qh@A≥CeEC≥JAG←1YKGi%←\~∀@@@AIK[←m∃fAio∧Of\~(~∀∪)!J@Am¬YkJAIKike9KH@A	rAOGQoB@A%fAB@↓MSq]UZAoQ%GP@A%b@`@↓SL@A9↑AOCIECOJ4∀@@@AG←Y1KGiS=\A←L↓iekYd@Ao←IiQYKMfACi=[fAo%YX∪E∀AI←]∀X@b@↓SLAi]BOfA¬eJ@AQ↑AEJ4∀@@@AOFO∃HA←\↓iQJA9KqhA≥CeEC≥JAG←1YKGi%←\X@b`AS_AioB≥fACe∀Ai↑A	JAOF≥KH@A=\ACY0~∀@@@AOCIECOJ↓G←YY∃GiS←9fXA←H@bbA%LAE←QP\@QQQKgJ↓]k[E∃efACIJA←GQCXv@↓iQJA⊃KGS[¬X~∧@@@Am¬YkKf↓CeJ@@X@bXpX@r8R~∀~(~∃=H$∩@@@↓'/∪)
⊂~∀~(∪∪L@↓iQJ@↓mCYk∀∪←L@↓=HASL@A]←8[]SX0@AiQ∀@AOCIECOJAG←Y1KGi←H@Aae%]ifA¬\~∀@@@AS9M←e[¬iSmJA[KgMCGJA∃CGP∪QS[JA≥CeEC≥J@AG=YQKGQS←\A=GGkeLX@@@!∪\∪B↓≥KoS<~∀@@@AS[AYK[K9iCiS=\XAi!SfA[∃cgCO∀ASfA=kiakPAi↑AQQJALαK3↔MεK9β7≡;≠'3/→1↓β≡+∃βC∞;∀4	α↓↓↓↓~iEU%∧K9βSF)αB∩αiEAβLkC3↔n+;Sπ&K?91εKQβπg≠=βC⊗K;SMε	β7↔∨≠π∨∃π;#↔8L	βOC∞≠∀4)α↓↓↓βO→β↔cε;∪↔"β←'SF{WQβ6KCOQε#?';8↓β¬β≡{7C3/#∃β∨∂∪π∨*β∂?3f+∂S'}q1β?∩↓β←#.qβ∧4R↓↓↓↓ε3'3∃αβ?I↓εK;≠↔⊗K?I↓εS?	↓εKE↓β≡c?O↔"↓β↔≡WO∃αβ¬↓β6K3∃↓ε{+↔∨!↓β←∂→β∨π⊗∪π∨∀hQ↓↓↓αβ∂?3f+∂S↔"q↓αO,)βπ3≡y↓#O&SWMε;∂←#zI84(hP4*O.)βπ3≡yβS#*βWO↔∩β';S/∪KWC'→β∨
n#π↔7|q1β∨~k?[↔⊗33/]bβπ;⊃ε;
73␈≠Oπ∨*p4(∀Ph)E92qI↓α∨βπ∂↔_h(4(hQ↓↓αNq↓α7∞≠3'OKS#∃π≠S?K∞;∃↓β/≠↔⊃↓ε3?H&dJNAβ}∪+↔∂'→↓β'~↓β∪'6K∪↔⊃αβ';SzβO↔[/∪π04V≠?;∂/βSWπbβOW&K['ON{;M1∧≠π33.!βOC∞≠↔M9α↓α↔π≡AβOC∞≠∃β∂}sSπ'w→β¬↓ε#'≠≠/∪↔;Qπ#gC∀hS?→β}∪+↔∂"q↓απfc?∂π&K?9βπ∪?∂↔,#MβO/βπKπ&+3eβNqβS#*β∪'≠6+K↔;"βOCπ≡+M1β↔+Qβ∨∂∪π∨(h+∂?fc↔∂SN{9β?2↓βπ∪bβOCπ≡+Mβ?≡≠WKMαβS?∨/##↔I¬≠';∂*βπ9↓ε{+↔∨!β'9ε{;∃↓π≠Cπ∂*β∂?Wf 4+∂}sSπ'rβ¬βC}K;S↔∩βS=β∞qβ?V+∂QβNqβπ;Jβ?S#/⊃βOC∞≠∃84Ph)↓↓∧3?Iβ/Cπ7Cf)1β'rβS#∃¬α∩A5↓β'7εc↔7↔w#πS'}q1βSF)βOC∞≠↔Mβ∂∪∃βπ~β≠?3f{←MhhP4)↓∧b&NPJ↓α∂?w≠↔M↓F#?SS.!βCπO∪@~J≥f"εM≡7'~aQ hT\≡&≡Bε5Bβ⊗w⊂HH∀∧α↓≠5V∩s2f⊃⊂HJ∧∧ααα∧
ε∞>Tε2k3⊃Q 			   Maclisp Reference Manual


  FIXNUM  Fixnums.

  FLONUM  Flonums.

  BIGNUM  Bignum headers.  Bignums also occupy fixnum and list space.

  SYMBOL  Atomic symbols.

  HUNK4   Hunks of various sizes.  PDP-10 implementations without hunks  do not
	  have these spaces.

  HUNK8

  HUNK16

   ...

  ARRAY   "Special array cells."

  REGPDL  The "regular" pushdown list.

  SPECPDL The "special" pushdown list, used in binding.

  FXPDL   The fixnum pushdown list, used for temporary numeric values.

  FLPDL   The flonum pushdown list, used for temporary numeric values.

  Binary Program Space	used to hold arrays and compiled code.

  pure LIST, pure FIXNUM, pure FLONUM, pure BIGNUM, pure HUNG4, ...
	  These  spaces  are  used  to store  "pure"  (read-only)  data  of the
	  indicated  types.  This  is a  feature used  to make	subsystems more
	  efficient.  See page 3-67.

   In the Multics implementation, the spaces are:

  list	       Conses  (dotted	pairs),  lists,  atomic  symbols,  bignums, and
	       strings.

  Static Storage       files, and linkage to compiled code.
		    Arrays,

  markedpdl    A pushdown list of LISP objects.


Page 3-62			   ∪3-1.6.2			   March 3, 1979
				  The System


  unmarkedpdl  A pushdown list of machine data, not LISP objects.

   Note:  in the Multics implementation  there is no space for	numbers because
numbers are stored in such a way that they do not take up any extra room.

   The precise spaces available in a given implementation can be  determined by
using (status spcnames), (status purspcnames), and (status pdlnames).

   Associated with  each space	is information determining  when an  attempt to
allocate in that space should cause a garbage collection.  The idea is that one
should allocate for quite a while in a space, and then decide that it  is worth
the trouble of	doing an expensive garbage  collection in order to  prevent the
space from using too many bits of actual storage.

   The exact nature of this  information varies with the space.  In  a pushdown
list (pdl)  space, all	information must  be stored  contiguously, so  the only
parameter of interest  is how big  the pdl is.	This  can be measured  in three
ways, so there are three parameters associated with a pdl:

  pdlsize The number of words of valid data in the pdl at the moment.

  pdlmax  The size to which the  pdl may grow before intervention  is required.
	  This is used to detect infinite recursion.

  pdlroom The size beyond which the pdl may not grow no matter what.

   A space such as a list space has three parameters, called the gcsize, gcmax,
and gcmin.  These are in machine-dependent units of "words".  The gcsize is the
expected size of the space; as objects are allocated in the space, it will grow
without garbage collection until it reaches this size.	When it gets above this
size garbage  collection will  occasionally be required,  under control  of the
other two parameters.

   The gcmax is  the maximum size  to which the space  should grow; if	it gets
this  big garbage  collections	may occur  quite  frequently in  an  attempt to
prevent it from growing bigger.

   The	gcmin  specifies the  minimum  amount  of free	space  after  a garbage
collection.  It may be either a fixnum, which specifies the number of  words to
be free, or  a flonum, which  specifies the fraction of  the space to  be free.
The exact interpretation of this depends on the implementation.  In  the PDP-10
implementation, which uses free storage lists, the gcmin is the number of words


March 3, 1979			   ∪3-1.6.2			       Page 3-63
			   Maclisp Reference Manual


which must be on  the free storage list  after a garbage collection.   If there
are not this many, the space  is grown, except if its size approaches  gcmax it
may not be grown by the full amount.  In the Multics implementation, which uses
a compacting  garbage collector,  the criterion for  garbage collection  is not
when a free list is exhausted but when the space reaches a certain  size.  This
size is the maximum  of gcsize and the	sum of the size  after Compactification
plus gcmin (if it is a	fixnum) or the size abter compactification  times 1/(1-
gcmin) (if gcmin is a flonum.) The  effect of this is to allow the  same amount
of  allocation between	gabbace Collections  as there  would be  in  the P@P-10
implementation with the same gcmin.

   Note thatAiQKMJAG←9ie←YL@A←m∃`AiQ∀∪gSu∃fA←LAgaC
KfACIJ@Ag=[KoQ¬hAS]∃qCGh0~∃gS9GJAi!KeJ@↓SfAe=k]IS9N\@@↓
←dA%]giC9GJX@↓iQJAA	 Zb@@AS[AYK[K9iCiS=\Aae∃gC]i1r~∃C1YWGCQKfA[∃[←er↓i↑AgACGKf↓S\AE1←GWf↓←L@jDd\Ao=eIf\A)QJ↓≠kYi%GfAS5aYK[∃]iCi%←\~∃¬YY←G¬iKf@↓Ch@A1KCghblfpP\@Ao=eIf@↓EKio∃K\AO¬eECO∀@AG←1YKGi%←]f@↓C]HAAeKgK9iYb~)G←]iI←YfAQQJAg%uJA←α1βCW≡C∪?←rβ3'O'→β'9ε∪3?∂←→β?→β	Y9β>{K∪Mph($)α↓αO?n)βOC∞≠↔M⊂π≠W∂!αβπMα⊗K;πKJαCK??∪π5α→βπ∂∃αβ'9β&C∃αB%↓5EAαβ'7Cd+7π;&S'?rβ?H4U≠SπSN_'OS␈∪π∂∃αβ'9β&C∃↓αo+3S'∨→↓β'oβ3↔7,sSπSL{9βπ⊗)↓β;␈!↓βO.∪+↔∂"↓βS=∧∧F/&≥≥F. Q(6}wN-vbε/∀απ&Tπ/≡↑%bα¬MRαε\≥f∞≡]\Vw"
xbπ&Z6*α∞>ε∞≡↑4εO~∧Vw&≡,VgJ≡W&}\≡FN~aQ$>.lZ&∞fO∀π&F↑<Rε∂,Tαπ∨≤6/~∞⎇ε/⊗T∞FF*∞,↔&*∧
v2ε≥MF}≡≡M⊗}r
_dX:<MO(λ≤
L8z9∧;Yβ!-;|⎇∧
xZY,>≤kλ∧
{Xy$;≠≠l<=→9¬A8<Y$∞<y9∧∧→[tL↑Y<H≥Yλλ
l=Y4D\Y9,EHλλ	;Xq$∞~→#!,>_8nD≤≠{
≤}(∃.<9λ→M}H≤⎇
}X9y$
8;X,|;93ND~;H∞M→<y$∞|_8l↑h~<d
[uλ∞M{h∩-↑≠|]≥]C!!"C"F∃MKLd∧∀⎇≠n,9y(λ={]≤M⎇λ⊃]-l⎇~;mnc"C!!"X;
Mxb"$∧λλ∀jXTH$<Yc!!"B5
(_;
Mxhλn;Xu
≥{H~.∀≥<y,Dλ≥≠d>_;-≥Y(_-lλλ≤l↑λ≤_.,;95↑\hλ
|H≥X.-;⎇<aQHλλ∧∧≤|_,<<hλ
=Z;Lt≥≠b,Mhλ≥m≡~λ≤nM|X9lTλ≠8-l9y;,]]H∧
≠hλ∞<=α<≡X;9.L<\k∧∞~→#!$λλλ∧<Y⎇-\;]λ∞Mh_;
Mxh≤m
⎇;→∧Y(_$
~<⎇∧{{]≥;Z;Lt_;H↑Y;H
n;8Y.$λ≠yD;→;,]]≤kAQHλλ∧∧∃~→$Z<\nA9;→-\;]λ
|H_(∧∞_:<D
<h≥
(λ≠L≥9(≠ld_(λ∞>_8y%D_;Y∧∞~→(∧∞y8{mlλ~<aQHλλ∧∧→:=
<H_$Z>≠N](λ≠n$_(e]~<⎇¬dλλ⊂$Z>≠N](≤|\z9Z,↑hλ≥
(≤→
M8>λ¬[|H∧(≤→
A"Hλ∧∧λ≤|≤y*(
}B=~T→x|m∨Y(_-lα9xm\>λ
m|H≠nM→<H∧∞|_8l↑kJ(λ∀λk-M<⎇λ∞>→8z,m9<k↓QHλλ∧∧→\[mT≠→9ND≥≠h∞-9z≥¬D≥~→$x|z/,+λ→l=8>∧;Yλ|{:;Ea;Z;∧
98;N4λY≠md⎇λ_m;Yy!QHλλ∧∧≥~~.4≤_<L≥9=→.%HH∪nM→<]m≡y(_$Z>≠N](≠=.>λ_Y$∞⎇<≤
M99∧>_y.∞λ~;D∧≥~→$∞~~<LA"Hλ∧∧λ→;]9;]∧¬≥~→$∧→x{-≥J+λ∞⎇→<Y$(λ→MM{];$
<h_,<y<≥≤[→+D∧λ⊂(ε5;~<nDλ_x-m[⎇λ,#"H∧∧λλ≥.<9λ≥m≡~λ_$∞→≠λ∞>_8y%a"C"A_;H→/e of this use of alloc, in the PDP-10 implementation:


Page 3-64			   ∪3-1.6.2			   March 3, 1979
				  The System



	  (alloc '(list (30000. 5000. 0.25)
		   fixnum (4000. 7000. nil)
		   symbol 6000.
		   regpdl 2000.))

     or, in the Multics implementation:

	  (alloc '(list (30000. nil 0.3)
		   markedpdl 5000.
		   unmarkedpdl 5000.))

	alloc may  also be called  with an  argument of t,  which causes  it to
     return a list of all the  spaces and their parameters.  This list is  in a
     form such that it could be given  back to alloc at some later time  to set
     the parameters back to what they are now.


   See page 3-87 for  some status functions which  are related to the  topic of
storage spaces.


1.6.4  Dynamic Space and Pdl Expansion


   There are several user interrupts generated by the storage  management.  See
section  page  3-16  for  a  description  of  user  interrupts.   The gc-daemon
interrupt occurs after each garbage collection.  The argument passed to the gc-
daemon interrupt handler is  a list of spaces  and their sizes.  In  the PDP-10
implementation, the items on the list are of the form:	(space-name free-before
free-after size-before	size-after), where space  is the name  of a  space, and
free-before indicates the  number of cells  free before the  garbage collection
and free-after	indicates the number  of cells free  afterwards.  The  last two
numbers are tne size of the  space (see (status spcsize)) before and  after the
GC.  (The sizes are in PDP-10 words.) In the Multics implementation,  the items
are of the form:  (space before . after).  In the Multics implementation, where
"free cells" is a meaningless concept, only the difference of these two numbers
is significant; it represents the amount of compaction achieved.

   The gc-lossage interrupt occurs if  the garbage collector tries to  expand a
space but fails because, for example, the operating system will not give it any
more storage.	The argument passed  to the interrupt  service function  is the


March 3, 1979			   ∪3-1.6.3			       Page 3-65
			   Maclisp Reference Manual


name of the space  that lost.  If the  interrupt handler returns, the  value is
ignored, and another garbage collection is attempted.

   The pdl-overflow interrupt is signalled when some pushdown list  exceeds its
pdlmax.  The pdlmax  is increased slightly so  that the interrupt  handler will
have room to run.  The argument Passed to the interrupt function is the name of
the pdl  that overflowed.  If  the interrupt function  uses too much  pdl, this
interrupt will	occur again.   If this	happens enough	times, the  pdlmax will
reach the pdlroom, there will be no  room in the pdl to take a	user interrupt,
and an uncorrectable error will occur.

   The	interrupt  function  can  decide  to  terminate  the  computation  that
overflowed the pdl, for  example by doing (↑g) or  a throw, or it  can increase
the pdlmax by using alloc or (sstatus pdlmax) and then continue the computation
by  returning.	Note  that,  unlike most  other  user interrupts,  if  the pdl-
overflow interrupt function returns nil (or the ";bkpt pdl-overflow" is $P'ed),
the computation is continued as if the pdl overflow had not occurred.

   The gc-overflow interrupt occurs when some space (other than a  pdl) exceeds
its gcmax.  This gives the user a  chance to decide that the size of  the space
should be increased and the  computation continued, or that something  is wrong
and the computation should be terminated.  The argument passed to the interrupt
handler  is the  name of  the space  that overflowed.	The  interrupt handling
function will be able tk run because the garbage collector makes sure  that the
space is sufficiently large before signalling the interrupt, even if this makes
it become somewhat  larger than its gcmax.   This interrupt is similar	to pdl-
overflow in that if the interrupt  handler function returns at all, even  if it
returns  nil,	the  interrupted  computation	proceeds.   To	 terminate  the
computation an explicit (↑g) or throw must be done.


1.6.5  Initial Allocation


   The PDP-10 implementations of Maclisp  run on a machine with  a limited-size
address space.	Consequently the  allocation of portions of this  address space
to different  uses, such as  LISP storage spaces,  becomes important.	This is
particularly true of the DEC-10 implementations, which cannot take advantage of
paging.

   When LISP is first entered, it  goes through a dialogue with the  user known
as "allocation."  Normally the	dialogue simply consists of the  user declining


Page 3-66			   ∪3-1.6.4			   March 3, 1979
				  The System


to specify anything, in which case LISP chooses suitable defaults.  If	a large
problem is to  be worked on,  the defaults may be  inappropriate and it  may be
necessary  to explicitly  allocate  a larger  amount  of storage.   It	is also
possible for the user's replies to come from a file.

   If LISP is called with a command line from DDT, for example

			    :LISP INDEX LOADER COM:

it reads the indicated file in	the same way that it would read  .LISP. (INIT).
See below.

   On the other hand, if LISP  is called without a command line,  it identifies
itself and asks
				    ALLOC?

Suitable responses are	Y, N, and CTRL/q.   There are other  obscure characters
which can be used as replies  tk this question, but these three  are sufficient
for most  purposes.  ("?"  causes a list  of suitable  responses to  be printed
out.) "N" means that you do  not want to specify allocation.  You will	get the
default.  CTRL/q means to rea` your initialization fIle (see below.)  "Y" means
that you wish to go through the following sequence od questions and answers.

   LISP types out the names of various spaces and their sizes.	If the	name of
the space is preceded by "#", then it cannot be expanded once allocated by this
dialogue.   After each	question you  may enter  aldmode, which  termifates the
dialogue and  gives the  remaining parameters default  values, or  space, which
goes on  to the  next question.   Befkre your altmode  or space  you may  put a
numbep which is the size you want thatspace th∞AE∀XAS]MiKCH↓←LAi!J@A]U[EKd↓iQCh4∃oCF↓aeS]QKHL@↓π!%_=JAeKMiCe@'→βS#*β∪'πf{∨.T∞vO&∧∞FF*∧(∀ddβpod$≤=0∩\z4ww∧EεEλ⊂⊂$cλ<wrP≤2x6 9 with a CTRL/a,	id @5KC]f↓i@≥β⊗+π"∂≥w/∩
_M≡~8;
∨X=~-⎇Hλ⊃M≥→+@∧	9C"NM→(∩*Jhλ∩-≡≠→;,]]_=
≥{Kλ∞M~<h∧
<h→-≡~→4D∧≥9~.≥P↔&∩ih↔∧J 	NIT) or  (ANIT)3 udir
.LISP., where udir Iq qour  master pπ]C[∀X@A∪8AiQJ↓)∨!&4b`@A%[aYK5K]iCQS←\X↓iQSf4∃Sf@↓→∪' 9∪≥∩@↓S\@AQQJ@A⊃SeKGβ#?Keαβg?UαβπK∃αβ3 >||V"α
→`O&udαα∧≥dααπMPLO]H

≤|c"M≥<≠∩[pp∞tation  thiq is  hd>stabd←up&LISP, @]QKeJAQHA%b@As=kd'F{7*M↔⊗.>Mw↔JaQ%≡Nl8Rπ&Tα∧o]JFN∨4
⊗oεL]V.wL≡FN}d∧ε&}↑=b?"
↔6*∧∞FF*≥Ff↑<≡FN}d∧ε&N≥Mv/.UDπ&F≡1PV6≥LRεO4⊗g>∨≡2π⊗\≤Bπ>Ybπ&T∧dM:∧ε≡}]\⊗v"
≡2ε>≡lVrπ⎇≡FBεmtε∂⊗}YV.wN5`hPQ$αα¬MRε6≡.7"εm}&jε≥dπ&FTfNfT∞6F␈]LBαε,Tε
ε=⎇Vn.nDπ>F≤=αεO4∞W≡.D∞Fzα≥g∨>↑$π&FQQ'∂.↑>FN}n5bα∧mzF*πM↔"π>↑πεg≥≥f:εm⎇f/F≡>F.wD∞7ε∞<Tεv∞\↑2εNd∞FF(≤=vnn]nBε&|↑6r?AQ&G/.EBαπ=tπN␈T∧ε≡∞d∧π/≡T∞FF*∧∞6∞nT∧ε≡}]\Vw"mw⊂NM≤f6/,]g"α
≥Wεf]\Vw&≡M⊗}w5dα∧∞aQ&/F≥↑εf*
|bπ&Tε6␈-Tε}2∞MεO~=vnn]nBεO7!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀αα↓65S
sefPHH∀∧ααα∧∧¬ε∞|Tβ~kfqPP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hPQ!∩αα∧∧ααα=vnn]nBε6∨
g.jεVββα∞?⊗n⊗⎇Dβ#βε∧ε6f⎇nVjβ&εβh!⊃⊂N⊗≤⎇g.jε⊗Cβα∞,V?εMDβ+βε∧εG.m7αβ≠εεβαHQ!PRα∧
FF*∞,Vn∞≥m⊗v:∧f␈⊗↑4εNr∧∞FF*m⊗f*≡&*α∞=⊗oεO∀π⊗.≤Dαε∞lDε/6≥NV∂&\Dαπ/=≥f:πMPhW>L⊗v&≡,Bπ⊗\≤Bn/l≥Boπ-≥g"εM⎇wαpQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q%ε∞|Tβ~kg↓⊂HJ∧∧↓≠~V∃c2sQ⊃⊂Jα∧	V∂⊗=∧β~bε↔∪;HQ `H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh&∃c:α	≥Wεf]\Vw&≥lr¬∨\.7O∨L]W~π⎇≡FB∧\≤6fO>↓PPh!Q hS∃frs
∧λVw&↑-⊗v:	I∃≥Q!PPh$∧α∧
∞>V↔∨≡>F.j
≡2αε≥dε.wM≡GJπM↔"ε←
↔∨'4∧εNr
]w∨"∞M⊗n*↑=ε∂⊗≥lrπ∨≡>F.o5dαα∧≡DεO_Q-f␈⊗\≥FgJ∀ε≡}↑
F/&T∞v␈⊗LDπ>F≤=απ&Tαπ/<↑"ε.nLW↔~/∩π'≡
⊗v:∀ε≡}]\⊗v"a→ε*πMVph-↔~α∞⎇ε∂&↑lW∩εl≤6Nf≡M⊗/~∧∞FF*∞>V↔∨≡>F.j∧
v66↑.2rαλ∀απ∨\.7O∨L]Rε≡≥dαε⊗T
w⊗N]nF. Q.F␈>≡,Bππ-|w⊗∞]]⊗v:D↔~πMR∧n≤=FO∨∧∧π∨..?↔∨&]TεO'<]F2ε≡5Bε␈$
↔"ε<≥bαε,Tε␈⊗≤]g&.AQ'&␈|≡& N∀∧πε∂.M⊗∨.L≡"αε≡∞εfN<≡FN}eDαε6}$αεNn>F∞v<Tαε≡⎇↑εNf≥lpLd~:ααπ∞-v?⊗≥↑2`h-}ε/⊗≡M⊗v:
\⊗≡F≥lW↔JD
w∩π=⎇G6Nltε&NllW⊗.nM⊗∞b↑↔.∂M≥vw~aQ hR∧∧∧n∞=M↔∨α∧
↔_Nn,W∂.]nFgJ∧∞W≡.D∧ε∂~∧∩αε,≡6*α
⎇bαπ⎇
⊗≡B∧∞Fzα.VNfD∞7.↔?≡7&.↑5`hT=⎇g≡/≡\Vw&O∀εO"
↔~ε,\Vrε↑≡VOπ\Bαπ⎇≡FBε∀
g.n,↑"ε}d
V.≡≥fO≡↑4π>F≤=ααε≥MF␈:∞Mε(h.>V↔∨≡>F.j∞}&O&↑$π&z|⊗Nr=voεL↑F*α=vw'-⎇Bε␈l↑"π&Tε␈ε↑,↔&N⎇dε}2∧	V∞≡M≡7αb
\⊗↑(Q-↔"π
}7≡N-LRπ&t
εN&T∞FF*∞l⊗>∂-≤W~ε|d∧n∞=M↔∨αn&}j∞Mε*εl≥↔6*∞↑6/∩
|bαε∀FN6l↑&.wAQ'∨..?↔∨&]UBε∞lDππ⊗}m⊗&*
≥f∨⊗\≡6."∧V66≤=⊗.v?∀εNr
\Vn␈/∀ε∞vD∞π⊗}<↑7≡␈$∧π/≡≤|Rε6}!PVF\≡fNg∃↑W≡.D∞7.↔?≡7&.↑5`hPQ!⊂HJ∧∧εNr∞Mε*∧~J2εN↑
F.n]nF∂&≥⎇`hPQ$αα∧I~5αε\∨∩ε⊗TVw&↑,V"ε/∀απ&TβTd~:ααF}$∧dM:dZJ=vnn≥lBrα
Mε(N]nfO⊗⎇mV.wD∞6/ Q.Wαε/∀π&F≡4ε≡}]\⊗v"
≡2π&Tπ∨&≥lF∂⊗D
⊗vOM≤⊗bε]nfO⊗⎇mV.wEdα∧d~:αεv}tαε>|↑2π&∞-w.>↓Q&∞r≥Ff}<≡FN}dFN∞M|w.*≥f"ε}∞FN}l≥FgJ∞,V∞'4∂⊗␈/$¬ddM:¬bαD→i∃"Jm⊗f*d∧α¬≡\Tαε6}!PVNlmw⊗n≡M⊗}r
⎇bπ&
≡2ph!Q"αα	I∃≥α
\↔Jα,Rε.nLW⊗.D∧ε↔J∞Mε*α=vnn≥lBβTI~5Nl≥V+

l⊗n+$∧ε&/dFO∩∧¬ε␈∩π)DM≥↓Q&&/g,FO∪=l⊗n+∀
f∞nV%∩rα	≥bπ&
≡2ε≡≡<Rπ&Tε6NLTε&/g,FO∪=l⊗n+∀
f∞nV$εO~∞,V∞"
≥bπ&QPW≡≥\Rπ>∨∀ε∂~∀ααtI~5αr¬	∀tME∀ε6NLUbα¬M
↔~ε<≥bαε,Tπ/≡\Dπ&z∞>F∂↔D∞Wαα∀π∨..?↔∨&]U`hUMRε&↑m⊗≡*LV6∂]NG~πMt∧%≤5Dαπ&Tε&O,\7&␈/∀ε&.l≡Vg'4∞Fzπ≥}W∩ε>↑'⊗.nDα∧$JDεn∂>LW⊂h.=f∞nT¬αrtZ9dlU∃Bε∞lDπ&FTfNfT
f∞n↑4ε&.l≡Vg"∞MrαtI~5αr¬	∀tME∃`hPQ$αα∧≡DεO~≥G≡z∞
w∨≡≤-F*πMtε↔.≥LBε
∞>V↔∨≡>F.j
≥bε
	I∃≥αD∞FF.d∞6∂6T
↔"ε≡1∃%~λitzpQ*FF*∧π$4|t¬ε␈∩∧λd|⎇i5∩αε=⎇Vn∞lDπ>NMDαπ&]bαε]nF/∩∞Mε*α∞>V↔∨≡>F.jD∧ε↔O≡7≡Nltπ&FQQ&∞fM|6∂&≥⎇bε&≤≥F}?\U`hPQ!⊂HJ
≥bπ&T∧$,5V∪αε≥↑εf.\]g&∂M≥vph!Q"αα	I∃≥α∧
V∂J∧&*ε]nF/⊗\Dαε↔∀∧π&FT
V}v≡Mw∩α=vnn≥lBα¬$	DM≥∧∧ε␈⊂~*Trα	I∃≥αd∧¬&FQQ&∞fM|6∂&≥⎇bε&≤≥F}?\TααG<\RαJ
≡0N.nLW⊗.Edα∧␈∞M⊗}v≥MGJε⊃→DM≥¬i∀tJ
≥bαπMRπ/<↑"?_Q!PPh)\↔⊗≡∧ε2bβ↔⊗sHH⊃∀αααα62k
fq⊂HJ∧∧ααα∧
ε∞>Tε2k3⊃Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hVM≡&.∨M}'Jε\∨∩αε,Tπ⊗.≤Ebαα	≤bπ&T∧$,5V∪αα
]vvOM}"ε∞MMw?~∧∞FF*∞↑6*α
|bε∞LM↔&N⎇l⊗`h,≡&?.\]g'~
⎇bαπMR¬∩=vnn≥lBαεM≥f*b∞Mε.r∞Mε*α∞↔↔&≤>Vf∂$
f∞nT
v2α∀ε6NLTαεn∨∀ε⊗(Q.7ε.=≤fN.D¬ε↔/D
f␈"∀ε&O,\7&␈/∃∩rα
Mε*ε←∞F.w=≥vrεL\f∂.NN2π&t	∀tJd∧¬&F≡1⊗6NLTεO_Q.&.∞D
⊗rα∞Mε*π<≥V*α∞|↔Jε≡4αε
	I∃≥αi→dJεm≥F*r∧∧¬&F≡4ε≡∞a≤&*π↑<V"α∞Mrπ∨L≡'"α∞↑αελQ.7.↔?≡7&.UaPPh$∧α∧∂4
⊗rπMR∧MJ4εNo
LVn.nL↔&N⎇eBε
∧∞7.↔?≡7&.T6∞r,Rπ≡≡lV"ε≥lBπ&]bαε≥nf}↑\Dε↔HQ.FF*≡ππ⊗}∞&N∂LT¬∩ε}$¬∃,d6}n\≥f"pQ!PPH⊃∀εNr∞Mε*∧↑]G&N>4εNo
LVn.nL↔&N⎇aPPh$∧α¬&T∧n∞  entered by  issuing the  LISP command  at Multics
command level.	If  LISP is called  with no arguments,	a copy of  the standard
initial environment containing all  the system functions and variables	is made
the current environment.  If the  LISP command is issued with an  argument, the
argument concatenated with  ".sv.LISP" is the  pathname of a  saved environment
which is  copied into  the current environment.   This saved  environment would
contain some  subsystem, which will  receive control.  Additional  arguments to
the LISP command in this case are actually arguments to the subsystem.

   Often one constructs a trivial  command for getting into a  subsystem, which
simply calls the LISP command with the right arguments.

   For	instance,  the	LISP  compiler subsystem  may  be  entered  through the
LISP←compiler  command,  which	calls  LISP  with  the	pathname  of  the saved
environment  containing  the  LISP  compiler as  the  first  argument,	and the
arguments to the LISP←compiler command as the remaining arguments.

   When the standard initial environment (i.e. the ordinary  Maclisp subsystem)
is entered,  it checks	for a segment  named start←up.LISP  in the  user's home
directory.  If such a segment exists,  it is read in, using the  load function.
This facility allows users to "customize" LISP.



1.7.2  Saving an Environment


   A subsystem is constructed by the following procedure.  One starts  with the
ordinary Maclisp subsystem,  and defines a  number of function	definitions and
variable values.  This creates an environment which is capable	of implementing
the desired subsystem.	This environment is then saved in a file, and necessary


Page 3-70			   ∪3-1.7.1			   March 3, 1979
				  The System


mechanisms are set up so  that an operating-system command can invoke  LISP and
cause  it  to  set up  the  environment  saved in  the	file.	When  the saved
environment is	invoked control  is passed to  the functions  in it  which then
proceed to do the business of the subsystem.

   The	exact way  of  saving the  environment differs	from  implementation to
implementation.  In the Multics implementation there is a function called save:

save		    FSUBR

	(save  foo)  saves  the  current  LISP	environment  in  a  file  named
     foo.sv.LISP in the working  directory.  foo is not evaluated.   The saving
     operation destroys the working copy  of the environment, so when  the save
     is complete LISP returns to Multics command level.

	All  variable  values,	file  objects,	array  contents,  and  function
     definitions (and other properties) are saved, but the contents of the push
     down lists, including previous values of bound variables, cannot be saved,
     so save  should only  be used  from top  level. (See  also the  section on
     Gaining and Keeping Control, below)


   In the PDP-10 implementations there is a function called suspend:

suspend		    LSUBR 0 to 2 args

	suspend puts LISP  in a state  such that it  can be :PDUMP'ed  (ITS) or
     SSAVE'd  (DEC-10)	and later  restarted.	When the  saved  core  image is
     restarted,  everything will  be the  same as  it was  when  suspended, and
     control will return from the invocation of suspend.

	suspend may be used at any point in a computation, with the restriction
     that no  I/O devices other  than the terminal  may be in  use.  If  an I/O
     device other  than the terminal  is in use,  a fail-act  correctable error
     occurs, indicating the offending device(s).

	In the ITS implementation, care  is taken so that all  subsystems saved
     with suspend from the  same version of LISP  will share the pure  pages of
     LISP.  In addition, all  invocations of a particular subsystem  will share
     the pure  pages peculiar  tk that	subsystem.  Declaration  of data  to be
     placed in pure pages is described in a later section.



March 3, 1979			   ∪3-1.7.2			       Page 3-71
			   Maclisp Reference Manual


↓In the	TOPS-10 implementation,  care is  takenqo  that alh  LISPs and
     subsystems saved from DISP will share the same high seGmeft.
¬
	After suspend has prepared the LISP core-ieage for dumping,  it Returns
     control to The oAKeCi%]NAgegiKZ↓c↑Ai!ChASPAGC\↓EJAIU[aKH8~∀~∀%∪DAgUgaK]⊂ASfA≥SmK\↓C\∪CIOk[K9hXAi!ChACIOk[K9hASf↓KqaY=IKFO∃H∪C]⊂AiQJ4∀@@@AeKgUYaS]≤AGQCICGiKH@AgiIS]NA%bAaCMgKH@↓ECGV↓iP≥β&C∃↓β⎇β↔Kπ&K;≥β∨KOS↔h∧αε∂4⊂hR∧∧ααε=p-\;Y↔λ⊂∀)BYP1v$[2P0w→⊂;0v≤2z↔(	(On IP	&AQQSfA%`
β∪}s∃β←M#!β¬αrZε2,)e↓β|p4)↓α↓↓αNJ1βSFKEβ'~β∪?;*β←'SBβ¬αB b&ε⊃p↓α?9¬">BMi	AβSF)βπK?+7↔nDεO~
_vv␈,\BrHβ"C!!5~→$
p23∧∞Y<\m≥{H≥.<<h≥
(≤q,={Yλ≡Y⎇3,]]λ
≤H≤≤L↑y;]¬D_<h∀λ→R-L(≠X-\+C"D∧λλλ
M→(~
≤zλ≤l\{9;ND~<hN8εx2Y⊂⊂:w→2y⊂ 4his name.  The lkw Segment  should then
     be saved with SAVE, ngtSSAVE.  This i@LAkgK⊂Ai↑A
aKCi∀AgkEMsgiK5fAiQ¬hAGC8~∀@@@AgQ¬eJAi!JAgC5JAQS≥PAgK≥[K@;"β∂?;&';'v9β∂?&)βOC,≠'≠'~βS:∞Mε*π>\'∨O>LVjPQ!PPL=x-]{[⊗$
{Y(∞⎇8ε6⊂≥y0z2H0P9r]8x⊂9≠zz4w→P37iλ0P9zX9|yz→vP6 )ie this:

     (progn
	   (terpri)
	   (princ 'options:)
↓   ... p¬KCH↓S\A←ββS'?w→↓99ph(%↓α↓#C↔↔βK%$hP%↓↓αCCK'v→↓∨3}∪';8H4(¬α↓↓99rβ3?π"β'9β6K3↔Mε{→β≠.s∂S'}sM↓9rp4(%α↓↓#∨~H4(%α↓↓#O∨#πSW~β∨∂SNk∃↓AHh(%↓α↓#OW∨β↔;⊃Hh(%↓α↓#OS∂∪Q7SF)7OW↔≠gOS.i$4)α↓↓↓↓JH4(4PJS#∃π≠WOO≠S↔5?→β↔;6KK?;n+;Q↓εKMβ;␈9βK↔∞#eβ≠␈⊃↓β∪.kC';:q↓απg#↔K;∂#'[↔gI04)α↓↓↓β}s∃β7N;#Qβ?∪'S∃αC?9αM"M$4Ph)↓↓α↓↓#O/≠C↔;"↓∨qj∧"V6A∧"N-j4z>∩&∪YαRM∧rNV
≥JM<4R↓↓↓↓βQ∩ε2bα∩>:*!<4)α↓↓↓βbH4(4R↓↓↓↓π;#'∂Bβ←'3bβ∪=β&C∃β∪.kAβ''≠↔3→ε;⊃βπ∪';Qε	β7↔∨≠π∨∃π;#↔9ε#?;∃r↓α?9ααNε&bβ?;∀hQ↓↓↓αβ7'∨G!β←KO#∀4(hP4(4Ph*Cπ>)↓M5;⊂$$%α↓MMk	9]9⊂H$%↓αα7πK≡A↓M1β	e]dhP				  The System



     (suspend '|SAVE SYS:FOO.SAV|
	      '(FOO SHR SYS))

     See also the valret function.


1.7.3  Gaining and Keeping Control


   In  the Multics  implementation, when  a saved  environment is  restarted it
looks like an error  that returns to top level.   The forms in the  errlist are
evaluated.   These  forms should  do  whatever	is necessary  to  start  up the
subsystem.  The  arguments to the  command which invoked  the subsystem  may be
obtained via (status arg) or (status jcl).

   In  the  PDP-10  implementations,  when  a  saved  environment  is restarted
execution continues  from the point  where suspend was	called.  The  next form
evaluated should do  whatever is necessary to  start up the subsystem.	 (It is
also  possible to  cause the  same return  to top  level on  startup as  in the
Multics implementation by using  valret instead of suspend.)  The  arguments of
the command line which invoked the subsystem may be obtained via (status jcl).

   If the subsystem wants to hide the underlying Maclisp from the user,  it has
a  number  of  facilities  available.  By  setting  up	its  own user-interrupt
handlers  it  can  handle  any	LISP  errors  which  occur  itself.   In  Newio
implementations, it can alter,	augment, or abolish standard  interrupt control
characters.  It can replace the Maclisp interpretive interaction loop  with its
own by using (sstatus toplevel) and (sstatus breaklevel).  It can  also provide
a totally different interaction loop  by not returning control to the  LISP top
level when it  is started, but instead	retaining control in its  own functions
which read and respond to user input.

   It is possible for a subsystem to retain the trappings of Maclisp but change
the way things read and print.	Macro characters and the readtable can	be used
to change the  way input is parsed;  alternatively, setq'ing the  variable read
will redefine the system reader function (in the PDP-10  implementations).  All
output by  Maclisp (with  the exception of  character-string messages)	is done
through the function prin1, and  the subsystem may redefine this  function.  In
the  Multics  implementation  one  simply  redefines  it,  but	in  the  PDP-10
implementations the variable  prin1 must be bound  to the function which  is to
substitute for prin1.


March 3, 1979			   ∪3-1.7.2			       Page 3-73
			   Maclisp Reference Manual


   Some subsystems don't do any of this, but simply consist of standard Maclisp
augmented by some additional functions which  may be used in forms typed  in at
top level.


1.7.4  Purity


   In  the  PDP-10  implementations,  there  are  some	facilities  which allow
subsystems tk put their  non-changing data( function definitions,  binary code,
etc.  into pure  pages.  This  decreaseS the  load on  memory by  sharing pages
betweef multiple users od the same subsystem.

   There  are  some  extra  storage  spaces  which  are  used  to   store  pure
(unchanging) LISP objects.  These are the pure list, Pure fixnum,  pure flonum
pure bignum, and pure hunk spaceS.

purcopy		    SUBR 1 arg

	This function makes and returfs a copy of its argument in pure storace.
     This is primarily	of use in the  creation oF laBge sharable  systems like
     MACSYMA.  In implementations  other than PDP-10 implementations  with pure
     spaces, purcopy simply petuRns itq abgument,	


↓There  are a  number  of fEatures  which  control how  binari  code afD
λ     consta`≥iLACeJ↓aceS→SCHAβ;#↔9∧	β∂?oβ'3↔ ∧ππ⊗|}&∞j
⊂d
≠x9\λ~3NMh∪∩*:	C"APA"P⊃≤5y3DBP⊂⊂⊂∃ i$`P&"FEβE	The  valqe Od  bporg Shoul@⊂@ACY]Csf@↓EJABα↓β≠'FsW51¬;#?O*↓β[πg+∃↓βM→βS#(h!↓↓α↓βπ∪'∪↔OMε{⊂∩α∞Mε*εm≡'∨"∧
Vw∂<XBπ>},Bαε|dε⊗Nl≡'Jα∞
&}∨,≥Rπ∨≤6*r∧∧¬&F≡4π6∞L\PhR∧∧ααε|]f/⊗≥IGJπ=
w.fDM}λ_Y$;⊃→.9λ_O∀≥~→$∞<y<ED_]0~λ7w6,H2|0vZw2r↔λ⊂⊂18≠y3P$\FE⊂⊂λ⊂⊂:x→0z2rλ;t2g→{2y⊂_4w0y≡P1wr→P4yP≠5pr2Y⊂1<P≠0x⊂7\α fasload.
¬

bpeNd		    VARIABLE

	This  variable should  also always  havE a  fixnum as  its  vaduE; this
     indicates	the  last avaidable  word  of binary  prograe  space,	This is
     updated by many internal LISP routines, such as the garbage collector, the
     array allocator, and lap and fasload.

Page 3-74			   ∪3-1.7.3			   March 3, 1979
				  The System


pagebporg	    SUBR no args

	Causes the variable bporg to be adjusted upwards so as to lie on a page
     boundary.	 This is  principally  useful on  ITS in  conjunction  with the
     function purify.  pagebporg returns the new value of bporg.


getsp		    LSUBR 1 to 2 args

	(getsp n flag) ensures that  (- bpend bporg) is at least  n, allocating
     more memory if  necessary.  If flag is  non-nil, then the memory  added is
     marked as being potentially purifiable by purify.	If flag is omitted, the
     value  of pure  is  used.	This  is  generally used  by  clever subsystems
     loaders to expand	binary program space quickly  so that fasload  will not
     require several garbage collections to do the same thing.	It can	also be
     used by programs which create and destroy many arrays.  See also noret.


noret		    VARIABLE

	Normally the garbage collector	will return memory to  the time-sharing
     system  if  (- bpend  bporg)  is  very large,  but  setting  noret non-nil
     prevents this.  This is useful in conjunction with getsp.


purify		    SUBR 3 args

	The first two arguments to purify should be fixnums, delimiting a range
     of memory within the LISP system.	The third argument is a flag.  If it is
     nil, then	the pages  covered by the  specified range  of memory  are made
     impure, i.e.  writable.  If  it is t, then  the pages are made  pure, i.e.
     read-only and sharable.  If it is bporg, then the pages are made pure, but
     in addition some work is done to make sure that no UUO on those  pages may
     ever be "clobbered".  (See  pure and purclobrl) This option  should always
     be  used  if the  pages  involved contain	binary	code loaded  by  lap or
     fasload.  Presently purifying in the TOPS-10  implementation; it
     is  intended  primarily  for  producing systems  built  on  LISP,	such as
     MACSYMA,  in such	a way  that  pure pages  can be  shared  between users.
     Example: the following function might be used to produce a sharable system
     on ITS:




March 3, 1979			   ∪3-1.7.4			       Page 3-75
			   Maclisp Reference Manual



	   (defun superdump ()
		  (setq lopage (pagebpore))	;save lkw page address
		  (setq pure 3)			;specifies pure code
		  (setq lopage (+ lopage 6000)) ;allow for area 1
						   ; (ITS page = 2000 words)
		  (fasload funny fasl)		;load up system
		  (fasload weird fasl)
		  (uread some lap)
		       ...
		  (sstatus toplevel		;set up top level for system
			   '(top-handler))
		  (setq hipage (pagebporg))	;save high page address
		  (purify lopage (1- hipage) 'bporg)   ;purify pages
		  (suspend '|:pdump sys:ts super↑M|)  ;tell ddt to dump
		  (terpri)			;stuff for system startup
		  (princ 'welcome/ to/ supersystem/!)
		  (terpri))


pure		    VARIABLE

	This variable, initially nil, should be made non-nil by the user before
     loading binary code which is to be made pure.  It signals lap  and dasload
     to be circumspect about any  UUO's in the code, because pure  UUO's cannot
     be  clobbered  to	be  PUSHJ's or	JRST's.   lap  solves  this  problem by
     clobbering the  UUO immediately  if  the referencEd  function  is albeady
     defined and is  itsElf a subr rather than an  expr; oTherwisa the  UUO is
     made permanently unclobberable (i.e. CALL is converted to CALDF, etc.).

	fasload  is somewhat  more cleveR8  iT too  triepεAi↑AGY←	EKd@↓KCGP↓++≡~(@@@@↓S[[Kα#'πS.ce1β↔+Q↓βN1β'Q∧∧6∞r}DαεOD
π/'4∞FF*∧⊗&',Z7~ε|dπ&FT∧¬-,t
vrα∀εfO>APRα∧∧αε≡≥MF."∞∞W⊗≡M|'⊗bD∞vFN=∧εO~=ε.≡<\Bε∂D∞FF*Yf"ε|dε.∞=∧ε≡∞MDπ&Zl↔≡f|≤Bbε≥l@hR∧∧ααε\≤6Bα
ZTxN⎇dπ&FQ≥FO∨D∧εO~=F}⊗,↑&."∧↔ OM↔"πM≥V*b∧
⊗0OMRε∂∞∞&␈π-≤↔&(Q$ααα∧g.v>M⊗}r
⊗"ε,\VrεM|⊗&.D'Jα∞Mε∂"<⊗fb∞Mrε6≡=F}∞Edα∧Nd∞FF*∧g.v>M⊗}r
lW6/!Q"αα∧∧ε&}↑4ε>/DF.6≥lV"b∞Mε.r∞∞W⊗No∀απ>≥MBε∞N=rε≡\6Zπ∞↑&≡f|.&bε≥lBαε=⎇g6/.Dε.∞=↓PRα∧∧α¬-Ytπ&z
≡G~π↑&n∞l]g&g∀∞Vv≡M|&⊗/,≤&f*mw⊗jaQ hP→≤bππ↑,RεF≡4ε
εm∨εw.T↔~α
≡G~πl≥G.*D∞FF.df∂≡M|⊗"α.W"εm}BαεL≡αJε,]ε∂6↑1PRα∧∧απ≡⎇\W>F≡Dε&NllW⊗.nMGJr∧∧ππ/,Tπ≡F}]F"ε,Tαπ&Tε&/=≡&."∞=↔V*∧
⊗rπ⎇}&'~∧
v2πMPhR∧∧ααα.↑V}f≥m7~ε≡,V
∪4∧π&F≡4εO~∞-w.vL\Bπ/∧∞Fzε∀∞vF}LTεw.\,W∩ε|dπε∞|↑2rα¬	⊗2π∞↑&(h$∧ααα
≡2ε⊗↑Nv..dε∩ε∞lDαβBD
↔"ε≡4π&FT
g.n,↑"αε|dπε∞|↑2π⊗≡Mε/∩∞Mε∞r∞Mε*α
nVn⊗↑$ε}0Q!PPh*⊗>*ε5S;0⊃⊃∩ααα62k
fuc H⊃∀αα∧\≡&≡Bε5Bβ⊗w⊂hP`H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh$∧ααα∞⎇w⊗'5e∩α∧L↑Bπ&Tεw.\,W∩ε|dπε∞|↑2ε⊗T
brαλm↔π∨Df∂≡M|⊗"ε<≥Fg~∞⊗>..
w⊗:D⊗v Q$ααα∧∞FF.d∞&/≡↑.f/~ε-bπε≤|W~ε|dε⊗Nl≡'Jπ∞-v?⊗≥Tπ∨ε≤<Rbπ]mF/∨4∩ππ,↑fN␈↑1⊗≡∞MDπ&xQ$ααα∧f∂≡M|⊗"α
↔~ε≥N&.∞O∀απ⊗↑<W↔6\Dπ&F]TααF∃lRrπMWJα≡&*π,↑6/↔l\Bαε⎇mGJε⎇l6*JaQ"αα∧∧¬&G↑4ε6∂=Mv∞"
↔~πN⎇rπ≡↑N2ε}d
bπε≤|W~πMtπ>␈-4π>OMπ2π>T∞6F∞MDε≡∞MDπ&FTfO↔>APRα∧∧απ≡↑Dα⊗∂,\∩β
$∧ε∞vD∞FF*∞<V≡}lDαπ≡↑Dα⊗∂,\∩β∩%dαα∧m}rπ>]f/6↑$ε6∂=Mv∞"∧
ε∂~∞MphR∧∧ααεM|⊗"ε∀6f},,W⊗∞-LR¬-YuBεODF}/4
f␈"∞
F∞≡T
↔"ε≥dπ&FT6}&T&.Nltεf}≤LV"b.W h$∧ααα∞,↔&F↑$εF∂=W~ε≡Dε∞vD∧πεf≤<W~ε≡DεNr≡&.
ε⊃⊗N2
≡Bπ>≡4εv␈D∞FF/,Tαε∞N,V∞'↔4ελh$∧ααα=wπJ
≡2απ
L⊗≡.D
⊗rα∞Mε*π<≥V*α∞,Vf∂M≡f*π
}6O&≥⎇bαε≥dε∂⊗\∀αβ∩d∧¬&F]dαε∞d∧≥ Q$ααα∧
⊗w∨N.V∨&≥⎇bπε⎇≥g&Nltπ&z∞Mε*α
ZTzε≥dε∂⊗\∀β
α
≡2πεL≤6."
≥bπ&Tαε⊗≥l↔↔J=v&*aQ"αα∧∧¬>F]dε∞fD
F}∞M≥f:α
↔~ε,\VrεM⎇f*b∧↔⊗.∀ε"εn∨∀ε⊗*∧∞π/⊗≤m⊗."D'/"≡&.
∧ε∩εn∨⊃PRα∧∧αεv}E`hPQ!∀v␈t∞vF.d∞'.vm≥f:α∞Mε*ε=|F*b∞Mε*α
ZTz?4∞ε}NnLV"πMtαε↔∀∞FF*λ5"?4∧εn∂∀&(h$∧ααα=F}⊗,↑&."¬∞FF*
λEαk⊗∧∧dM:∧¬-,t
ε∞vMLW∩ε≡4ε≡f↑lW∩ε≤-w/"λ5"JD∧ππ⊗}m⊗&.EDε}0Q$ααα∧6␈/.<RbπM↔"πMRπ6≥NV*ε|dεv␈↑]rαε≡4εvNEDε∞vD∞FF*=v&*∞⎇⊗fb∞.Vrαl↔∨&↑$π&FQQ"αα∧∧π≡.=⎇f"πM≥V*ε≡-w.vD&.≡≡↑6*πMRα¬λ:B?~∞⎇⊗fb∞
vNwD∞Fz¬
Z4DR}5bαα	
w>/l↑"bε≤aPRα∧∧ααG>>F∂'↑4π/.⎇M⊗v←5∀αεO46∞fL\Bbα∞Mε.r≡&.
ε$αεO46␈ε≤\Bαε,≤6Zε≥nFxN≡,V
β∃APRα∧∧αε.llV∨&≡lVgJ∞]f≡f|,&/⊗≥lrε∞MDπ&FT
U,z}5bα¬M
↔~ε≥MF␈?4∞FF*∧6∞fL\Bε7]l7&N⎇n0hR∧∧ααπMtε⊗*∞N&∞≡\Dε∞>≥≥bbεm}"ε/≥WεfUDε␈∩∞,V&.m≥f."≡2ε/∞∞"ε≡|LRrα	l↔'/,≥FgJD⊗ph$∧ααα≡&.

L↔⊗>T∧ε.v}\vBπMtε≡}nL⊗Nr∧⊗fb∞Mε*¬ZYr?~∧∞6F␈]LBε⊗T∧π⊗/<↑'6.G4αG∨L≡G/_Q$ααα∧∞W.}M≥f←~∀¬π
wee∩πN≤]F'~
≥f6␈-\↔&N⎇dπ⊗.L↑f∞wD∞FzπM
↔~r∧λ↔~ε∀∞'.fT
v2πM∞Vn∩AQ"αα∧∧π&FT↔⊗.∀
π≡␈]LBε⊗Tε#α*
L↔⊗>↑$απ&≥bπ&Tεw.\,W∩ε|dε7.l>FN}n4ε≡∞MLV"α/∩π&QPRα∧∧αεf|≤F."∧6}&T¬εNv=NV&Nltα∧d~:αε7]l7&N⎇n2απ>\6Bε≡4αε/≡\⊗bJa_f␈∩∧∞FF*λHT~k⊗↓PRα∧∧απ6↑.6N}eDππ/,Tεn∂∀&*α∞<W"πMtε
εl\v∂&≡lRαπl≥G.*d∧π&FT
V∞>m≡G.&T
↔_O↑<V"ε≡1PRα∧∧αε∞-}f*b∞⎇εNfT∞FF*∞=⊗>r=vw'-⎇G~π⎇
⊗≡B∞<V>n]nBπ&t
F}∞D
⊗w&t¬πε␈=≡FO6T∧βjεM}phR∧∧ααπ<\vn.nN2bεl\v∂&≡lRβj

⊗>B∞<V>n]nBJr∧λ∩εv\|↔&OlTπ6∞N\Rε∞N=rε≡≡↑6/~∞↑V}f≥m7_h$∧ααα≡&.
ε∀απ&tvzε≥dαπ&Tεf␈t∞6.>\]g"b∧⊗v"≡&.
ε$αεNd∞FF*

⊗>B∧∞6.>\]g"r∧λf␈⊂Q$ααα∧6}o≡FN⊗≥M↔'JD∩εv\|↔&OlTπ6∞N\Rεn\≥g~πMRπ≡≥\Rε∂4∩πε}=↔&OlTπ6∞N\RαπMtπ&FQQ"αα∧∧∧M%4
⊗oεL]V.wL≡FN}eaPPh!Q'π/,=F}↔-A∩αα∧
d
∀__$d(Q!PPM↑<V"ε/∀ε6∂=Mv∞"∧∞Fzε<\WαπN,⊗≡Z
|bα¬ZYr?~∞⎇εN≡∧↔⊗*∞
w&.nM⊗∞fO⊃⊗↔/D
f␈ Q$ααα∧
⊗nn\M⊗∂&]K∩ε≡M|&⊗/,≤&f*aQ hPQ%'π/,Q⊂Jα∧∧¬4
)_∀∀dQQ hP~MεO~∧∞f∂⊗≤≤&f(≤=vw'-⎇G~ε≡↑F}n≡M⊗~α∞∞W⊗Nm≤6∂&≥⎇bαε|dα¬~\←ππ⊗↑>6N}n4ε∞vAQ"αα∧∧ε∂&⎇]⊗~π?≥V⊗}N5bα∧≤dεO"
≡2π≡↑Dεv}e]fNb¬∞FF*
≥fO&≤≥Bπ6≥NV*ε≡4εvNE∃Bπ&]bπ&QPRα∧∧αε6⎇MF␈>≥lrε∂,TαπεL≤6."
≥bαπ∞↑&*π>Mw⊗∞|Tπ∨ε≤<W~α
≥g∨&\≤Bε}a≡&.?]L↔∩π>Mw⊗∞|QPPh!Q$n∂,=αβ~Dε∪K;⊃⊃⊂Jα∧α3~k∃frs ⊃⊃∩αα∧∧αα¬≤v*β5Vs8h 			   Maclisp Reference Manual


     spaces:  pnames of atomic symbols; list, fixnum, flonum, bignum,  and hunk
     constants used  by code loaded  with fasload; properties  whose indicators
     are in  the list  which is the  value of  the variable  putprop (initially
     subr,  fsubr, and	lsubr).   In the  SAIL	implementation, if  *pure  is a
     fixnum,  it  should  be an  estimate  of  the total  number  of  pure data
     structures needed, including all  files previously loaded and  the initial
     LISP  system pure	data structures  (currently about  6000.  words).  This
     causes purcopy to use the high segment for pure data.  Making the estimate
     in *pure too large merely wastes space in the high segment; making  it too
     small causes purcopy to make copies in the low segment when it runs out of
     room in  the high segment.   This whole  feature only works  if pure  is a
     negative fixnum.


putprop		    VARIABLE

	If the value of *pure is non-nil and the third argument to  the putprop
     function is in the list of  indicators which is the value of  the variable
     putprop, then the second argument is passed through purcopy to  purify the
     structure.  Furthermore, the  two cells of  the property list  are cons'ed
     from pure list space.  Since  impure cells must precede pure cells  in the
     property list,  putprop may not  put a  new property at  the front  of the
     property list in this case.

	The putprop and remprop  functions know about purified	property lists.
     If necessary,  they will copy  the property list  (but not  the properties
     themselves) into  non-pure storage so  that it can  be modified.	This is
     true regardless of the value of *pure.  Recall also that defprop and defun
     use putprop.















Page 3-78			   ∪3-1.7.4			   March 3, 1979
				  The System


1.8  Miscellaneous Functions



1.8.1  The Status Functions


status		    FSUBR

	The status  special form  is used to  get the  value of  various system
     parameters.   Its	first  argument, not  evaluated,  is  an  atomic symbol
     indicating which of its many functions status should perform.  The  use of
     additional  arguments  depends  on  what  the  first  argument  is.  These
     arguments may or  may not be evaluated,  depending on the	first argument.
     If certain additional arguments are omitted, a default value  is supplied,
     again  depending  on  what  the first  argument  is.   The  various status
     functions are listed below.

sstatus		    FSUBR

	The sstatus  special form is  used to set  the value of  various system
     parameters.  Its arguments are similar to those of status.

These are the things that you can do with status and sstatus:

STATUS FUNCTIONS FOR I/O

tabsize   (statuS tabsize)  returns the number	of character  positions assumed
	  between tab  stops, which depends  on the  implementation.  Currently
	  this	is  8 in  the  PDP-10  implementation and  10.	in  the Multics
	  implementation.

newline   (status newline)  returns a fixnum  which is the  ascii code	for the
	  character which marks the end  of a line of input.  For  example, one
	  might say (= (setq ch (tyi)) (status newline)) . Cureently this is 15
	  (octal) in the  PDP-10 implementation and  12 (octal) in  the Multics
	  implementation.

charmode  (status charmode  f) returns the  value of the  character-mode switch
	  for the file f.  If f is  t or omitted the value of tyo  (the default
	  output terminal) is assumed.	If the character-mode switch is  t (the
	  normal case for the terminal) output is sent to the device as soon as


March 3, 1979			    ∪3-1.8			       Page 3-79
			   Maclisp Reference Manual


	  it is  generated.  If the  switch is nil  (the normal case  for files
	  other than the terminal) output is held until a newline is  typed, an
	  error occurs, input  is requested, or  the buffer becomes  full.  (In
	  the Multics implementation, you can also cause the buffer to	be sent
	  by  using  the   force-output  function.)  This   provides  increased
	  efficiency at the cost of  not immediately seeing all output	in some
	  cases.

	  (sstatus charmode x f) sets  the character-mode switch of the  file f
	  (f may  be t or  omitted to  signify the output  terminal in	the tyo
	  variable)  to x,  which may  be nil  or t.   x and  f  are evaluated.
	  Currently in the PDP-10 implementation it is not possible to	set the
	  character-mode switch;  one must specify  it Initiallq To  open.  See
	  also (statuS linmode) and (status fiLemode)*

λlinmode   (statuc linmoDe) rea`	fAQQJ@@	YS]J↓[←IJλAC]HQggi¬ikFA1S][←⊃J∪pR↓gCiF4∀∩@AQQJ@E1S]J@↓[←IJλAi↑A`@@Qh↓←dA]%X\R@↓)QKg∀AMk]
iS←]LAiCW∀@AC\↓←aiS=]CX~(∩@AKaieBA¬eOk[∃]hXA]QSGP↓SfAi!JAMS1JAoQ=gBAY%]JA[=IJASLAEKS9NAISMGkgg∃H\~∀$@A)Q%fAIK→CkYiLAi↑AQQJAm¬YkJ@↓←LAieR@Qi!JAIK→CkYh↓S]akP@AiKI[SMC0RT@A%\~∀∩AC]r↓GCgJ0AiQSLAMSY∀A[kgPAEJA∧AiKe5S]CX8@A∪\↓c←[JAS[a1K[K]QCiS←9fAiQ∀~∀∩@EAS]∀A[OI∀DA[CdA]←h↓EJAG!C]OK⊂\@A∪_AiQJEYS]∀A[OI∀DASf↓hX@AUgKdA%]akh4∀∩@A%bAEk→MKeK⊂@Ak`↓B@AY%]JACP@ABAQS[J@↓EKM←IJAEK%]N@AMK]hAQ↑@A→%' \@↓)QJ~(∩@AS9akh[∃ISiS9NAG←9mK]i%←]fA=HAiQ∀AQ←gPA←aKICiS]≤AgsgQKZACIJ@AkMKH\@↓∪D
∀$@AiQ∀@EYS9JA[←⊃JDA∪β→β;'baα2&≥'O↔/→β↔π≡Aβ∂#∂∪π∂S/⊃βπMεKQβ'~↓βSG∧+⊃βπv 4(¬αβπCCdK↔MβM#E↓β⎇;9β'wβWQ↓ε+∪'SNs≥β∂|s[↔;&K?;MpIαS#O→β7?&)↓β∂∞qβCK␈3'∪∀hP%↓βHsCWQ∧3π∂'fKC'↔~β7?K*βOW'&+⊃βSzα2&Nαβπ;⊃¬β?OOL∧&gJ,W'→<H∧
_;Y
M;Y`
|C"B∧∧≥~→$∞→<[-≥X;∧
9Hλ
≡λ~<d(λ≥∂≡→(≥
=∪	~tλλ
=Y⎇|d(→|L\=λλL8;λ≤[⎇=¬A B(∧	≠⎇y.l<Kλ
≡λ≥<l↑h≠;n,(≠8,=~;Y$∧≤Y<m}<Xq.5Hλ∩.D~<h∞
||z,-→(→M}Hλ_$∞<y<AQ@∧P⊂≤97sy_vP:7H:0urH24y2Xz⊂1g[:97fλ⊂7s⊂≥42P:→y2tw_v⊂;t→w⊂:4→P⊂⊃6~w2P6[r2QεB∧P⊂$\P74f∞P⊂47]r{2i⊂:44\P⊂6p↑P92x]ty2P~w7{v→r3rPλ7s⊂*~2P⊂∀≤yz0z≥yP::≡TWεEαP⊂*4→P&zv≥4qyP~vx6 %maftation always  operates with a "line mode"  of t.
	  SeE alco the (sstatuc ttysc@¬\RA
U]GiS=\AEK1←n\~(~∃iieS]h∩@QggQCikf↓iasS9hAGQ¬dAMk9F@AM%YJRAQke]f↓←\AB↓iir@↓S]iKIekah↓GQCE¬GiKd8~∀α@↓/QK\↓iQJ@↓GQCe¬GiKd↓GQCdASfAQsaKH↓←\@AQQJAS9akh@↓iirA→SYJXAiQJ↓→∪' 4∀∩@AAe←Oe¬ZAoS1XAEJ↓S]iKIekai∃HAC]⊂AiQJ↓Mk]GQS←\A→k]FA]SYXA	J@ACAaYSK⊂Ai↑~(∩@Ai]↑ACe≥k[K]Qf@ZA→SYJA¬]HAG!Cd\@↓∪LAM%YJASLA←[Sthe value  of tyi
	  (the	default input  file)  is assumed.   The  char may  be  either a
	  character object  or a fixnum  (ascii code).	Any  of the  128. ascii
	  characters  may  be  used.   The  func  may  be  either  an  ordinary
	  functional form or  a fixnum, which  means the default  system action
	  for the character  with that ascii value.   For instance a func  of 7


Page 3-80			   ∪3-1.8.1			   March 3, 1979
				  The System


	  means quit  back to the  top level of  LISP (control-G).  If	func is
	  nil,	the char  is made  non-interrupting.  All  three  arguments are
	  evaluated.

	  In the ITS implementation, it  may be necessary to use  (sstatus tty)
	  to inform ITS about non-standard interrupt characters.

	  In PDP-10 implementations which  support fixnum tty input  mode (more
	  than 128. characters), then when an interrupt occurs the character is
	  folded  down	to  7  bits  before  selecting	an  interrupt function.
	  However, the unfolded character  is passed as the second  argument to
	  the interrupt function, so that the function can filter  out unwanted
	  characters.  If a  fixnum is used for  the function, then  the fixnum
	  may  specify	required  or  forbidden  supra-ascii  bits  as follows:
	  adding bit n to the fixnum  requires the bit, and adding (lsh  n 18.)
	  forbids it.  For example,  in the ITS implementation	using 400000207
	  (octal) as a	function allows CTRL/g to  perform a quit, but	not the
	  "pi" character or control-meta-g, since 200 requires the  control bit
	  and 400000000 forbids the meta bit.

	  Example: a standard  subsystem convention (used by  NCOMPLR, MACSYMA,
	       and SCHEME,  for example) is  to use ↑↑	(control-uparrow, ascii
	       036)  as a  quit character  which restarts  the	subsystem. This
	       leaves ↑g with  its normal meaning  of "exit to	LISP toplevel,"
	       which is occasionally also useful.

   (sstatus ttyint 36
	    (function (lambda
		       (f c)
		       (sstatus toplevel '(restart-subsystem))
		       (do nil ((or (= (listen f) 0)
				    (= (tyi f) 36))))
		       (↑g))))
   (defun restart-subsystem ()
	  (setq errlist nil)
	  (sstatus toplevel nil)
	  (nointerrupt nil)
	  (initialize-the-world)
	  (enter-subsystem))

	  (status ttyint  char file) returns  func, the interrupt  function for
	  the  character  char on  the	tty  file.  file  may  be  omitted.  It
	  defaults to t.

March 3, 1979			   ∪3-1.8.1			       Page 3-81
			   Maclisp Reference Manual


ttycons   (sstatus ttycons tty1 tty2) binds two tty files into a  console.  One
	  should be an input tty and the other an output tty.  If tty1	or tty2
	  is t, it  will be taken as  the appropriate direction of  the default
	  terminal (determined by the variables tyi and tyo). The binding into
	  a console is	primarily used for  purposes od ecHoing.   In addition,
	  interrupt chabacters	typed on  an input tt`∩∪→SYJAMQ←kY⊂@ACM→KGhAQQJ~∀$@A←kQakhA=\ASiLAG←eIKga←9IS]Nαβ?WSπ+Q↓β'#eβ≠Nc∃1βv{Qβ?rβG?7*↓β?SF+IβS'I84(J↓α'→π#SeEε{IβS'IIβπg∪↔π∪Jβ#πMε	βSSN≠?;Mπ∪↔3π&K?;OFKA1β&CπQβ⊗+3πSN{;O#O4(%αβ'Mβ↔∪?/↔rβ↔≠␈∪∃βSF)β;↔:β?;∃εKMβ↔∨#π3O≠#↔⊃ph(4(J↓α'→ε{;∃β∂∪∨W7.sQβ'~β¬βS'Iβπ;"βS#∃ε{S#↔∩β'MβvK11β
βSSg≡{;Mβ⊗+3πSN{;O#O4(%αβ';[}c[';:βS#π"βSSeπ;'31ε∪∃β⊗{/↔9r↓α∂3␈≠';≥ε	βSSJ↓β≠'f)βπW&{7πSN≠π33Hh(%↓ε∪K↔π←→βπ;JβSSg≡{;Mβ⊗+3πSN{;O#O↓β'Q∧kπeβF[∃8JBO↔∃ε≠3?O*q$4(hP%↓α&yβCW"β↔∂#}K;≥β∂!βS#*β?S&{5β?2βS#∃π≠∂K↔.q1β∪O≠S';∨!β≠K}iβ?W'βWQ0hP4(%α↓↓↓↓G≠OSπ'+MβS'K∂?;~βP4(HH%↓↓α↓↓↓#≡+SEβ.≠#?S'I↓#?ε+9↓∨'#ei↓:C↔∂#zβ?WQπ#Se%Hh($$HI↓↓↓ε+∂#?'#e%$hP4(%αβ←#'≡Aβ∂?w≠↔Mβ'#eβ'wβWQβ>KS!β
β;↔]π#Seβ␈+SCW"β∂#πvs↔1β>C'∂!εKM↓β≡+QβSxh(%↓ε;=βSzβS#∃ε+∂#=εK↔¬εQβSF)β?'#?5β}1βS#*βO∂K.+984Ph(%↓αCOSπ'+MβS'K∂?;~βSSe
IβK↔'+K;Mπ##∃β␈##↔Iπ#Seβ6K3∃β>C'∂!εKM↓β⊗{W;⊃εK;S<hP%↓β
β∂?;≡{3∃β>KS!β'#eE1ε{Iβ;Naβ'→π##↔K*β'Mβv{;∃8hP4+≠Nc↔7?&)↓↓#∨#πSW~β≠'3.k?∪∃ε3'3∃J↓↓uyαC?C↔rk7?∪*k3'O"↓8''w#↔K;∞a7∂K.3Q%9αβ?C↔rh4(%αβ7?∪*k3'O"↓β'Mαβ¬↓β∨+'Sπ⊗c∃βO.≠?;⊃αβπK∨.k↔;Qαβ≠?IαβS#∃αβ?C↔rβ≠W;∨#'?9ph(%↓εK;S↔⊗sπ17∨∪W≠Qαβ'M↓ε	↓β3O≠Q↓β}1↓β'oβ3↔7.sSπSN{97∪/β↔;∪.sQβ'v3?K7∂#'?8hP%↓β>C'∂!εkπeβ≡{7↔SNk↔Mβ⊗)β;↔.#↔⊃β↔IβOC.≠'π1πβK?∨⊗7M8hP4(%ααS#∃ε3?33␈;';≥π≠g7}cMβ7∂I↓βππβ↔πIεK9β'w#↔K;∞a7∂K.3Q8%E##↔O(KπK∃π##∀4PI↓βO&;∪π⊗#'k↔"β?;↔≠Yβπ∪&KS'?v1βONk?3~β7πeεCC↔∂⊃βπQπ##∃β&KO∂K/#'?9ε{_4(J↓βS#*β'7Cf+7↔;&S'?rq$4(hP%↓β∨+KO?↔β?L%¬##'Mε3'3∃αCπ9β␈+SCW"βSSeJβ#πMπ##∃β∞∪'3''I↓βSzβC?OO#'?8hP$$%εKSMβ∨+KO?∩βπ;g>C↔K∃ε{9βSF)βO∂⊗+↔99¬≠↔∃β∨+KO?↔β?M8hP4(%αβ≠'3/β?L%¬##∃β6K3↔C␈→↓β≠.s∂S'}qβ∂πrβ∃↓π+O↔⊃π#<'π≡≠↔OMπ∪π;∪}k3d4PH$%β>KS#'rβS#∃ε3'3∃r↓αO↔*βS#∃ε3'3↔ε{Mβ≠.s∂S'}q84(hP%↓β↔+?W IαS#O→↓β≠Nc∃↓↓F9↓↓ε{WSC/!↓βS'I%↓βFM↓↓π≠↔3↔∨#'[∃αβ↔Kπ≡(4(4Ph*Cπ>)↓M5C⊂$$%α↓MMk	9a9λH$%↓αα7πK≡A↓M1β	e]dhP0$$HI↓αSF)αOg∨#↔44Ph(4(HH%β∂∂βπ'fKSe9α↓#∂W↔≠?KC␈→↓↓∨BIβ←'fa↓β←␈∪-9α≡+∃↓β∞cO=β&C∀4(HH%βK.∪?WQε3W;∂&K?91πβπ∨∃αp4(4PI↓βO∞K0$%¬##'Mαβ≠'3*↓↓#πr↓β?W'βWQβ'#e%↓εCπM↓π##∃↓π≠=7∂∞c3↔⊃¬~ε&0hP$$%ε≠#πK∞≠S↔Iπ≠↔Q9ααS#'~β'Mβ∞qβ↔c&+;O'}qβ?→εO∂'Jβ←#'≡Aβ'LhP$$%π∪↔3π&+⊃βSzβWQεs?Qβv+∂↔O≡K'3Jβ'∪↔w#'∂πbβS-β&C∃βπ∨#Wπ0hP$$%ε≠#πK∞≠S↔I¬≠↔Qβ/≠↔⊃β∂!αNεLa84(hP%↓αN1β≠'f)β'Mε	β∂3␈≠↔⊃β6K3∃β}∪+↔∂"a↓#O&SWMε3'3↔n{∪∃%εk↔K↔gIβK↔'+K;Mεs'04PI↓β'w≠S↔π"β?→β>K[';:βπ9β/∪K?Iph(4+'#gO∂∞q↓↓↓G≠OSπ'+M↓β'#gO∂∞qβ≠Wv→↓β≠Nc∃%β∞c3?←_KS#∃π+O↔IαβS=βpply  a function
	  which  performs  initial processing  of  terminal input.   func  is a
	  functional  form,  and file  must  be a  tty	input file.   If  it is
	  omitted, the value  of tyi (the  default input terminal)  is assumed.
	  Both arguments are evaluated.

	  When LISP wants to take  input from file, it first calls  the prescan
	  function, which is supposed to  gobble down a complete unit  of input
	  (for instance an S-expression) and return a list of  characters.  The
	  prescanner supplied automatically  by LISP when  a tty input	file is
	  first opened counts parentheses  and does fancy rubout  processing on
	  display terminals.  It also implements the CTRL/k, CTRL/l, and CTRL/u
	  characters  (as appropriate  to the  implementation) which  allow the
	  complete  input to  be redisplayed  or cancelled,  and takes	care of
	  force-feed  characters.   A  user-written  prescanner  might	provide
	  additional features such  as super-parentheses, name	recognition and
	  completion, or fancy editing.

	  The prescan function	func is applied  to three arguments:  the file,
	  the name of  the input function on  whose behalf it is  acting (read,
	  readch, or readline), and a fixnum which, in the case of read, is the
	  count of the number of unmatched left-parentheseS.  It is supposed to
	  return a  list of fixnums,  which represent characters.   The prescan
	  function should pead the input with tya, since it And tyipeek are the
	  only iNput functions which don't call the prescan.

	  If the prescan function returns nil, an eof condition occurs	for the
	  input File.  This is the standard way to Signal over-rubout.

	  There  is  a fUnction  called  rubout to  assist  the  pre-scanner in
	  proceSsifgrqbouts.  It is described on page .
¬

March 3, 1979			   ∪3-1.8.1			       Page 3-83
			   Maclisp Reference Manual
α

	  It is a good idea  for the prescan funcTion to  lambda-bind echofiles
	  to nil so that characters do not appear in the echo files  twice, and
	  sO  that  the  echo  files reflect  the  "clean"  input  after rubout
	  processing.  The system-supplied prescan fUnction does this.

	  (status ttyscan file) returns the fIle's func.
¬
	  This feature does not presentlq exist in the Multics implEmentation.

The fOllowing status functions exist only in the ITS implementation

ttysize   (status ttysize f) returns the height and width of the  terminal open
	  as the file f.  If f is omitted, the value of tyo (the default output
	  terminal)  is  used.	 The  result  is  a  dotted  pair   of	fixnums
	  "(ttyheight  . ttywidth)"  (cf.  cursorpos).	 If the  terminal  is a
	  printing console instead of a display, then the height will be a very
	  large number such as 200000000000 or so.

ttytype   (status ttytype f) returns the type of the terminal open as  the file
	  f.  If f is omitted,	the value of tyo (the default  output terminal)
	  is used.  The result is  a fixnum taken from the TCTYP  (not TTYTYP!)
	  variable in ITS:

	   0	   Printing terminal.
	   1	   Good Datapoint.
	   2	   Bad Datapoint ("loser").
	   3	   Imlac.
	   4	   Tektronix.
	   5	   PDP-11 ("Knight") TV.
	   6	   Memorex.
	   7	   Software terminal.
	  10	   Terminet.
	  11	   Display using standard ascii display codes.
	  12	   Datamedia.

	  This status call  is meant only for  esoteric purposes.  To  find out
	  whether you can position the cursor or erase characters,  use (status
	  filemode).

tty	  (status tty  f) returns  a list  of three  fixnums which  control the
	  behavior of the terminal open as file f.  If f is omitted,  the value
	  of tyi (the default input terminal)  is used.  (sstatus tty x y  z f)


Page 3-84			   ∪3-1.8.1			   March 3, 1979
				  The System


	  sets these three fixnums to x, y, and z.  If z is omitted, it  is not
	  changed.   If f  is  omitted, the  value  of tyi  (the  default input
	  terminal) is used.  The  three fixnums are the ITS  variables TTYST1,
	  TTYST2, and TTYSTS.  Their meaning is as follows:

	  TTYST1 and TTYST2 are divided  into twelve groups of six  bits.  Each
	  group  controls  a certain  subset  of the  ascii  characters.  These
	  groups, in left-to-right order within TTYST1 and TTYST2, are:

		    (0) ↑@-↑F ↑K ↑L ↑N-↑R ↑T-↑Z ↑\-↑←
		    (1) A-Z a-z (letters)
		    (2) 0-9	(digits)
		    (3) ! " # $ % & ' , . : ; ? @ \ ` | }
		    (4) + * - / = ↑ ← (arithmetic operators)
		    (5) < > ( ) [ ]  (parentheses)
		    (6) ↑G ↑S
		    (7) ↑I ↑J (tab, linefeed)
		    (8) altmode (ascii 33)
		    (9) ↑M (carriage return)
		    (10) rubout (ascii 177)
		    (11) space, ↑H (backspace)
	  The meanings of the six bits in each group are:

	  40   Echo the character when read by LISP (normal mode).
	  20   Echo  the  character when  typed  (this may  disappear  from ITS
	       soon!).
	  10   Echo in "image mode" rather than "ascii mode"
	   4   Convert lower  case to upper  case (applicable only  to letters;
	       not  normally used  by LISP  - the  readtable  accomplishes case
	       conversion).
	   2   Activation characters.  If  this bit is	not set, then  ITS will
	       not schedule LISP  to run when you  type a character  within the
	       group even  if LISP  was waiting for  terminal input.   The only
	       purpose	of this  is  to increase  the efficiency  of  the time-
	       sharing system.	For  example, letters and digits  normally have
	       this bit off, since typing one cannot terminate an S-expression,
	       and there is no point in "activating" LISP until an S-expression
	       terminator like space  or ")" has  been typed.  An  exception to
	       this rule is that for  tyi and readch LISP asks ITS  to activate
	       on any character.  Normally only groups (0), (5), (6), (7), (9),
	       (10), and (11) are activators.  If you alter the  readtable, you
	       may wish to change the activator groups.


March 3, 1979			   ∪3-1.8.1			       Page 3-85
			   Maclisp Reference Manual


	   1   Interrupt characters.  If this bit is not set, then even  if you
	       have used (sstatus ttyint)  to set up an interrupt  function you
	       will not get the interrupt  since ITS won't tell LISP  about it.
	       Initially  only	groups	(0)  and  (6)  cause  interrupts (these
	       include	all   control-characters  except  altmode   and  format
	       effectors).  If you give  @ an interrupt function,  for example,
	       you should set this bit for group (3).

	  On a keyboard with supra-ascii characters, one may wish to  use meta-
	  characters  for  interrupts.	 Suppose  we  want  meta-D  to	run the
	  function foo.  Then  we would turn on  the interrupt bit for	group 1
	  (letters) and say:


	     (sstatus ttyint 104    ;letter D
		      (function (lambda (f c)
				(and (= c 504)	;meta bit
				     (foo))))	; is 400
				       - filter out plain "D"
	  Notice  that this  only handles  meta-D, not	meta-d.  To  handle the
	  latter, one must also do (sstatus ttyint 144 ...).

	  Another way to filter out plain "D" is


	     (sstatus ttyint 504   ;require meta bit
			 '(lambda (f c) (foo)))
	  which is  somewhat more efficient.   On the other  hand, to  use both
	  meta-D and control-meta-D, we must do a dispatch on the control bit:


	     (sstatus ttyint 4
			 '(lambda (f c)
				  (cond       ;ignore
				   ((or (= c 304)(= c 344))
				    (setq ↑d t))
				   ((or (= c 504)(= c 544))
				    (meta-d-foo))
				   ((or (= c 704)(= c 744))
				    (control-meta-d-foo)))))
	  The third variable, TTYSTS, has these bits of interrest:
	  40000←22 (%TSFCO)  If set,  output on this  terminal uses  the supra-


Page 3-86			   ∪3-1.8.1			   March 3, 1979
				  The System


		    ascii  convention of  an "alpha"  prefix for  "control" and
		    "beta" for "meta".
	  20000←22  (%TSALT)  If  set,	ascii codes  175  and  176  are not
		    converted to 33 on input.
	  10000←22 (%TSROL) If set, terminal is in scroll mode.
	   4000←22  (%TSSAI) If  set,  echoing and  ascii output  use  the SAIL
		    character set; otherwise, control characters are  output in
		    the form "↑X".
	     10←22 (%TSNOE) If set, suppress echoing of typed characters.
	      2←22  (%TSSII) If  set, terminal	uses "super-image  input" mode.
		    Not even ↑Z and ↑← can take their usual effect for ITS.

	  Notice that some of these bits affect output even though the argument
	  is an input file; they affect the output terminal which  is logically
	  related by ITS to the input terminal.  Normally LISP or the user will
	  arrange for (status ttycons) to reflect this relationship.


STATUS FUNCTIONS FOR THE OLD I/O SYSTEM

uread	  (status uread) returns a  4-list for the current uread  input source,
	  or nil if uread is not being done.

	  (sstatus uread --args--) is the same as (uread --args--)

uwrite	  (status  uwrite) returns  the 2-list	for the  current  uwrite output
	  destination.

	  (sstatus uwrite --args--) is the same as (uwrite --args--)

crunit	  (status crunit) returns  a 2-list of	the current unit;  i.e.  device
	  and directory.

	  (sstatus crunit device directory) sets the current default device and
	  directory for uread, etc.  The arguments are not evaluated.

crfile	  (status  crfile)  returns a  2-list  giving the  file  names	for the
	  current file in the "uread" I/O system.

	  (sstatus crfile name1 name2) sets the current default file  names for
	  uread, etc.  The arguments are not evaluated.



March 3, 1979			   ∪3-1.8.1			       Page 3-87
			   Maclisp Reference Manual


STATUS FUNCTIONS FOR THE READER

   See section	13.6.2 for a  description of how  the parameters  controlled by
these functions are used.  All of these parameters are kept in	the readtables,
and the status functions  below deal with the  readtable which is the  value of
the  variable readtable.   Note:  in the  following, c	represents  an argument
specifying a character,  If c is non-atomic it is evaluated, and the valua must
be a fixnum which is the ascii code for a character(∧@A∪_AFASLACi←5SFASP@ASf↓]←h~)KmCYUCiKH0AC]H↓ShA[¬rAEJ↓BAMSa]kZA=dABA
QCeC
iKdA=EUKGP\~∀~)GQie¬\∩@@!giCiUfAGQQeC\ARAOKQfAiQ∀AGQCICGiKHAieC9gYCi%←\Ai¬EYJA∃]ier%M←dAQQJ~∀$@AGQ¬eCGi∃dAF\%)QSf↓SfAi!JACg
SRAG=IJA←_ABAG!CeCGQKdAgUEgiSQkiKH↓M←dA~∀∩@↓oQK\↓Sh@A¬aaKCIf@Q]=hAae∃GKIK⊂@AEr↓gYCg RAS\%BAa]¬[JAE∃S]N@↓eKCH↓S\\~(∩@A)!Sf∪M∃Cike∀@ASf↓kgKHAS\@↓iQJAA	 Zb@@AS[AYK[K9iCiS=]f@AQ↑Aie¬]gYCQJ~∀∩AY←o∃d[GCMJAS]AkhAi<Akaa∃`AGCMJ\~∀4∀∩@@!ggiCQkf@A
QieC8AF@A,RAgKQf@AF≥fAGQ¬eCGi∃d@AiIC]gY¬iS←\↓i↑@A,\@@A,ASf~(∩@AC1oCsf↓KmCYUCiKH8@A'K∀AiQJ↓gKige]iCp↓Mk]GQS←\\4∀~∃ge]iCp$@@QgQCikf↓gs]i¬pAFR↓eKikI]fAi!J@Age]iCp↓ESif↓M←dAQQJAG!CeCGQKdAF0@ACf↓B~∀∩AMSq9kZ\~(~∀∩@Qggi¬ikfAMs]iC`AFAZ$AgKiLAFOfAgs]QCpAE%ifAi<AZ\@↓ZASfAKmC1kCiK⊂AC]H4∀∩@AIKike9KH\@↓)QJAMKigs9iCpA→k]Gi%←\ASLAkgk¬YYbA∧AEKiQKdAo¬rAi↑↓I↑Ai!SfX~(∩@AQ=oKmKHX~∀~)≥P∨S*βS#π"↓β'9π##∃↓ε?[*βS←=π≠OSπ'+M↓β≡3#Mbβ'→↓ε→β'Mε	↓β7∞≠K=β≡CπKπ∨#↔I↓εKQβ'_h+∂#∞s∨↔⊃ε∪π∂-π#=β''→βOS∞s∪πK"↓βOgw#πaβ∞s⊃β∂G#Kπ9ε∪↔≠?⊗)βS#*↓βK↔∂+↔OS.!β?C-∪πS'}p4+π~βC↔K6{K'↔ q↓α#|εv/6↑%BεNd
⊗rπMRπ∨L≥f&∂,Dπε.≤NF∞⊗LTε~ε≡4ε
ε\≤7⊗Z¬
∩v*d∧rε∞hDβXh,≥f"πE∃BεNn>F.∞D
v2ε,]⊗v:=ε∞v|\BαπMtεO'4∞7&∞lL↔⊗"∞?⊗w&∨∧ε∞vD6G',≥bαε≡N2π∨≥nF∂@Q-↔~π<↑Bπ&tεSβ∩¬∞6f∂=
⊗6N\Dε/GL]f&.D⊗gε≤&/&≤5∩ε∞lDεO'46G',≥bεO4∞6/"∞MrεON<Vf2aQ hV\≤7⊗x∀∧αG∨L≡G/~
\⊗∨⊗) returns nil if c is not a macro character.  If  c is
	  a macro character it returns	a list of the macro  character function
	  and  the  type, which  is  nil  for normal  macros  and  splicing for
	  splicing macros.

	  (sstatus  macro  c f)  makes	c  a macro  character  which  calls the
	  function f with no arguments.  f is evaluated.  A fourth  argument to
	  sstatus may be  supplied.  It is not	evaluated.  If it is  an atomic
	  symbol whose pname begins with s,  c is made a splicing macro.   If f
	  is  nil,  instead  of  c  being  made  a  macro-character,  c's macro


Page 3-88			   ∪3-1.8.1			   March 3, 1979
				  The System


	  abilities  are  taken  away  and  c  becomes	an  ordinary  extended-
	  alphabetic character.  The  setsyntax function is generally  a better
	  way to do this, however.

+	  (status  +)  gets  the value	of  the  + switch  (t  or  nil)  in the
	  readtable.  This switch is normally nil.  If it is t,  atomic symbols
	  more	than  one  character  long  beginning  with  a	+  or  a  - are
	  interpreted as numbers  by the reader  even if they  contain letters.
	  This allows the use of input bases greater than ten.	See ibase.

	  (sstatus + x) sets the + switch to t or nil depending on x,  which is
	  evaluated.  The new value of the + switch is returned.

ttyread   (status  ttyread) returns  the  value of  the ttyread  switch  in the
	  readtable.  At present this is  not used for anything in  the Multics
	  implementation.   In the  PDP-10 implementation  it controls	how tty
	  "force feed" characters are used.

	  (sstatus ttyread x) sets the ttyread switch to t or nil  depending on
	  x, which is evaluated.  Again, file defaults to t.  The new  value of
	  the switch is returned.

STATUS FUNCTIONS FOR THE PRINTER

terpri	  (status  terpri file)  returns the  value (t	or nil)  of  the terpri
	  switch for the  file, which defaults to  t.  This switch  is normally
	  nil.	If it is t, the output functions such as print and tyo wilh not
	  output any extra newlines when lines longer than linel are typed out.
	  See also the terpri variable.

	  (sstatus terpri x file) sets the terpri switch.

W	  (status ←  ) @IKike9fAiQ∀@AmC1kJ@QPA←d@↓]SXR↓←LAi!J@A>↓goSi
P∪M←HAiQJ4∀∩@A
keeK9h@Ae∃CAiC	YJ\@↓∪L@AQQSfAMoSiG ∪SfAPX@Ai!JA>@↓M←e[¬h@AM=dA←GQCX~∀$@AMSa]k[f↓oSiP↓Y←if↓←LAiICSYS9NAuKI←KfA%bA]←PAkgK⊂\~∀~(∩@@QMgiCiUfA>A`AMSY∀RAgKQfAiQ∀A>Ag]SiGP↓i↑Ai!JAmC1kJA←_ApXAPA←dA9SX\~(~∃CE	eKmS¬iJQgQCikf↓CEEe∃mSCi∀R@Ae∃ice]LAiQJ↓mCYk∀@A←L↓iQJ@↓CEEe∃mSCi%←\AG=]ie←0\~∀∩A'KJ↓gKGi%←\@bL\nAM=dABA⊃KgGe%aiS←8A←LAQQJAC	EeKm%CiS←8AG←]Qe←X\A≥←i∀~∀∩@↓iQCh↓iQJA¬EEeKYSCiS=\AG←9ie←X↓SfAW∃ahAS8AiQJ↓Gkee∃]hAe∃CAiC	YJ\~(~∀~∀4∃≠Ce
P@fXbrnr$∩∩@@&fZbαqa9DHH%↓↓α↓↓↓αε∨∃↓~iad4P0$$J↓↓α7∞≠3'OααK↔≠-∪↔;∂*α7π;.0$λhP4λ⊂∧αG∨>L↔'∞4⊗⊗↔,ZfN∂LTεrJ∞<Wπ~∞Mε*ε≤,'⊗/m_↔&N⎇`ε≡}nN&}b∞MrεraQ h⊂⊂∧αG∨>L↔'.4⊗⊗↔,ZfN∂LTεvNE∀π'<[\d
yQH≤X\Y.m8=~-⎇KC"AP@∧@⊂
9yz0]:qP X192k~pz2P≥⊂P::\71P'[⊂6p|~vpv⊂_vwzg≥⊂7s⊂_q192]4pz4[w↔εEαA)b U*iP#∃g!b∧Se)P#∪i⊂*∧⊃P#`i⊂ cbP⊂af&"Ph∧OR

αgctime	  (status  gctima) Returns  the number	od∧A[S
aP∨O,≠?;∪~↓βOC.sQβ∨∂∪π∨*h4(∀∧ε≡}MHV∨&≥lr`h!Q Jα¬∞7∨&≡NW~ε|>FNnT∧εrJ∞,W≡=≤h∞M→(λ@qz4vYP1w`5nterto  n anDAeKiUeUfAQQJ~∀ @Aae∃mS←KLAmCYUJA←L↓iQJA≥GiS[∀AG←k9iKd\4∀∩∧∩A∪hA%`
β¬∧∧v}}D
,L8(∃
t→≠h¬xj(≥Yλ≥
;H
∞≡⎇_=∞↑h→xnM99(ε¬(λ~N≡⎇λ⊂L\[tY!Q@(λN8εx$[3P7z]⊂0P 3ubsyStee.  SeE also (status gcwho).
~∃MaG]C5Kf@@!giCIUf@AgAG]C[∃fRAe∃i`↔Kw→↓⬬FO∨D∧ε}2∞Mε*α
l⊗n/4
v N≥MBαπMRπ∨≤6/_Q!ααε≡hλ-≥_8[T~;@∞M→(∪	~tλ_L];Q`∞↑y1βD∧∃~→.≤(_<LT≥~→$
X;9.4λ_8l<<≥_,-→(≥
q"B(∧∞~→(∧9≠∪l4λ→U-l⎇~;ma8;Y∧∞≠b=
(λ→M⎇≠≠um≥Yb<nL=→4a≤];XnM;{\d∞z~0m↓ B(∧∞Y<=-≡Y(_$∞|_8lT_8Yn]9;]¬A"C"N>_|z/,(λλ¬∞⎇_=∞↑h≤|>z>Y$∞|_8lU(≤Y.Nαy79H⊂:42H0qz:Xv⊂1z\92w:λ9t⎇2H7s⊂⊂≤x0qbK⊂4wεB∧P⊂+[y29Wλ⊂9x0XpP4iH2{0v≥pz2rεEεE→qvp|αP⊂∀9]0z:iH3qvp↑⊂9x0XrTP)→z:y7≤P:42H3qvp↑⊂80y_vrz2\⊂37`2 space.

	  sstadus gcmax space n) seTpεAiQ∀AOG[¬pAaCIC[Ki∃dAM←HAgaC
JAi↑↓\\~∀4∀∩@AMKBAi!JACY1←FAMU]GiS=\\~∀4∃OG[%\∩@@!giCIUfAOG5S\AgACGJR↓eKikI]fAi!JAOG5S\Aa¬eCKKQKdAM=dAga¬GJ\~(~∀∩@↓ggiCQkfAO
[S\AMaCGJ↓\RAg∃ifAi!JAOG5S\Aa¬eC[KQKdAM=dAga¬GJAi<A\\~(~∀∩@↓'KJAQQJAC1Y←FA→k]Gi%←\\~(~∃OGMSuJ∩@Qgi¬ikfA≥GgSu∀AgaC
JRAe∃ike]L@AiQ∀AOGg%uJAa¬eC[KQKdAM=d@AgACGJ\A)QSL~∀∩@↓SfA]=hAiQ∀ACGiUCXAg%uJA←_AiQJ↓gaCG∀@ZAg∃J@QgQCikf↓gaGg%uJR\4∀~∀∩Aggi¬ikfA≥GgSu∀AgaC
JA\R↓gKif↓iQJA≥GgSu∀AaCe¬[KiKHAM←d↓gaCG∀Ai↑A8\~∀~(∩@A'∃JAiQ∀ACYY=FAMk9GiS←8\~∀~)!COJfZr`$∩∩@@&fZb8p\b∩$∩@@A5CeGPfX@bdnr~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∃aUegaG9C[Kf@@@QMiCikLAakeMaG]C5KfR@↓eKikI]fAB%YSgh↓←L@A9C[Kf↓←L@AMaCGKLAoQS
P~∀∩@@@@AQCm∀Aake∀AmKeMS←]f8@A'K∀Aake
←ar\4∀~∃aUegSu∀@@@QMiCikLAakeMSuJAMaCGJ$@AeKQke]f↓iQJA¬GikC0@AGkIeK]h↓gSuJ↓←L@AQQJAaUeJ~∀$@AmKIgS←\↓←LAgACGJ\A∨]YdAgaC
KfAe∃ike]∃HAErQgiCQkf@AAkega
]C[KLRAQCYJ~∀∩Aake∀AmKeMS←]f8~∀~∃AIY]C5Kf@@!giCiUf@Aa⊃Y]C[∃fR@AIKike9fAB@↓YSghA←L@↓iQJA9C[KfA←L@↓CYX@↓iQJAAIYf~(∩@ACYCSYC	YJAS8AiQJ↓→∪' ↓EKS]≤AkgK⊂\@A)!KgJA¬eJAi!JA]C5Kf@A¬GGKaQCEYJ↓i↑~∀$@AiQ∀AM←Y1←oS]≤AgiCQkfAMU]GiS=]fAo!SGPAIKckSIJABAAIXACIOk[K9h\~∀4∃aIYMSuJ@@Qgi¬ikfAAIYgSiJAaI0RAeKQke]f↓iQJA
keeK9hA]k5EKdA=LAo←IIfA←8ABAa⊃X\~∀4∃aIYI←←Z@@Qgi¬ikfAAIYe←=ZAaI0RAeKQke]f↓iQJ@	aIYe=←ZDA=LABAAIXXA$]J\AQQJA[¬qS[k4~∀∩@↓gSuJ↓i↑Ao!SGPA%hA[CdAKmKHAOe←\\~∀~)aIY[¬p∩@@!giCiUfAaI1[CpAAIXRAIKike9fAiQ∀AGkeIK]hAYCYkJ↓←LAi!JAaI1[CpAACeC[∃iKd~(∩@A←_ABAa⊃X\~∀4∀∩@@!ggiCQkfAa⊃Y[Cp↓aIYg%uJRAMKifAQQJAa⊃Y[Cp↓aCeC5KiKd↓M←dAQQJ@AAIXAgACGJ~(∩@Ai<AgSu∀\@A¬=iPACIOk[K9ifACIJAKm¬YkCi∃H\@AMKJAC1g↑Ai!JACY1←FAMU]GiS=\\~∀4∀@@AQQJAM=YY←o%]NAgQCikf↓Mk]GQS←\A∃qSgiLA←]YdAS\AQQJA!⊃ Zb`↓S[aY∃[K]i¬iS←\4∀~∃[∃[MeK∀@@@QMiCikLA[K[→eKJRf words of address space not yet
	  allocated for  any purpose  (i.e. still  available for  allocation to
	  various spaces).

ENVIRONMENT ENQUIRIES

Note:	the  various enquiries	related  to time  may  return nil  in  the rare
circumstance that LISP cannot determine what time it is.

date	  (status date) returns a 3-list of fixnums indicating the current date
	  as (last-two-digits-of-the-year month-number day).

dow	  (status dow) returns an interned  atomic symbol which is the	name of
	  the current day of the week.

daytime   (status daytime) returns a  3-list of fixnums indicating  the 24-hour
	  time of day as (hour minute second).



March 3, 1979			   ∪3-1.8.1			       Page 3-91
			   Maclisp Reference Manual


system	  (status system x) returns a  list of the system properties  (that is,
	  properties whose values are  supplied in the initial LISP  system) of
	  the atomic symbol x, which  is an evaluated argument.  This  list may
	  contain  subr, fsubr,  lsubr, macro,	autoload, or  array if	x  is a
	  system  function,  and  value  if  this  atomic  symbol  is  a system
	  variable.

LISPversion
	  (status  LISPversion)  returns the  version  identification  of LISP.
	  This is usually an atomic symbol.

jcl	  (status jcl) retqrns	the "job command line"	from DDT in  the PDP-10
	  implementation.   This  is  used  to	specify  the  init   file,  but
	  interpretation of the file name is terminated by altmode, and (iN the
	  ITS implementadion  at least) ↓dditional  infOriation may  follow the
	  altiode,  The init  file may wish  to examine This  information.  The
	  DEC-10 implementation suppoRts two syNtaxe@LAMOdαβ#∂1Ph(∧λHI↓↓:∩α2&NβY↓7+≤a44(J↓↓↓↓ε;⊃↓αrIα2M~A!](λmE*#"AP@(λ	M⎇λ⊂-Mλ⊃⊃(∃,,λ
}→<X.M;Y`⊂≤|yz2[yP9z\87y:λ13p∀h syntaxes,  hoWever anD
	  some suppoRp neither.  In the MultiCpεAS[AYKKKαsSπ∪L{9βSFKEβK-#@/⊗β\h∞M→#"A∀λ→0≤≤47r2XSr⊂second arguma`≥hAWLAQQJA→%' AG=[[C]⊂X@A←HAKYf∀A]CXASLAQQJ~∀$@A2M~Aβ∞|k7π~ β∪'⊃∧s?QβF[∃β';=βεα,w.n]nG
Hλ

<9(
∞>_1≥.4_8Ye∃J(∩,D⊃∩4j↓ ¬∧Pλ9p`∪ invo-K@AEd~∀4P@$&2M~Aβ↔w3'K⎇mV.wK⎇f∞nT∧&&}tλ&∂∩!Q h⊂α λ∞M→3@⊂
9z0z≥yP5![∀Pε@> (f O h∞@↑ADABαβ@∩λβ"C!!(λ∃

<h⊃N]X⎇~-⎇H~0→H⊂0v9[P:y`%d bi  subsysteMq impleme@9iKHA!\@A≠¬GYSg@Ai↑~(∩@A`%GVAk@AiQJ↓CeOK5K]if↓Ie←Z↓iQJAα≠?77∞s⊃β←FK∂!βLs[?/,∧Bπ&YR`H!Q'.ε≡!∩αα∞>F∂'↑4π.~<@∀λ92z:\4εc The nama  O`∧AiQ∀AcGβ⊃∨Mβ&K@⊗.>Mw.∧W⊂⊂∩w	the ITS
∩@↓S[aYα+7.β]_.M9{@∞
~8h∧
<h∃
(≥<l↑Iph∧∧Y8<nL<@⊂→[0r`%", which  IpεAkgβ+π32Hh %↓¬##∃β≡'¬α∂→↓βSF)βG∂,ε"?~
l⊗n
λ≡2απ,ZG∂⊗βY ∩λ1<P∀≤z0z:\P:w0[pTW∧H$s⊂*~2BE∧λ⊂&zv≥4qyP~vx6"[p¬ftatign thic is the us@∃`@∨M∧#↔π(¬Gαα∞⎇w⊗↑≥lrε&≡,V∨&}/∩pH!∀α∧NβH⊂~~2P"'T)P
 "@AS[a1K[K]QCiS←8AiQSLASfA∧AYSgP@Qae=PAae=NR\~(~∃k]¬[Bα@QgiCQkfAk9C[JR↓eKikI]fAC8@AS]QKe@;,!βπS}k'
β≥K7?bβ←#?≡)βC;∞k∃↓βM→βS#(h(%↓π+O↔I?→β3?>K9β;∞k∃9↓∧K9βSF)α&R~β'7Cd+7π;&S'?rβS#'~β'MβW+OQβ&C∃↓:αYdlQQ hPQ*ε∞>Tε2kK!⊃⊂Jα∧α3~k∃gαcλ⊃⊃∩αα	\↔⊗≡∧ε2bβ↔⊗sHh `H⊃⊃∩α¬MR¬∨≡>F.hQ!PPh!∀ααr∧∧∧Nr∧∧π&FQ∀∧o.NM⊗∨~∧
⊗oεL]V.wL≡FN}d∧απ&
≡2αα
≡2αα
≥bαα∞Mε*αmw⊗n≡APPJ∧
W≡/%jπ⊗},\7"t≥n7&∞l<SZπMRε&}Dπ>NMDε⊗*∞=F∂≡
≤fN.D
⊗2π∞-⊗w"
≡2π/<\Bπ&qQ JαM↔∨εL∨∩π&
≡2rα	≥bπ&T¬$⎇
5Sα
≥Wεf]\Vw&≡M⊗}r∞MεO~
≡2ε∞>NV∞fO∀αε

M↔∨ Q!∩αα∞∞&}R∞∞&}:∀∞&/π,↑6.wM≥f:πMRππ-⎇&.∨E↑π⊗}},⊗nn↑$εw.\,W∩π,≡FF/$∧π&F≥dελh!∀απ∨≥\&}bd∧¬≡.T⊗g≡t¬π∨&≡NW~π↑<W⊗NE∃`hPQ$αα¬MRε6⎇MF␈>≥lrπ∨L≡G/~nVv∨M≥vw~←εO∨D
vvg∀
⊗rπMR¬∧J¬Sα
≥Wεf]\Vw&≡M⊗}raQ hW↑<W⊗NA∀ααG>L↔'/4∞W≡/-≤BJα∞N&N/4∞Fzα∞,W'/-dε∞r
≤F.wM≤fN≡≡M⊗}r∧
v2πMRαπ↑<W∩α≡0hP∀∧ε␈π
}6."∞Mrε∞d
⊗&.nM⊗6N<≡FN}d
v2ε≥dεNw>L⊗v≡T
v2ε
≡2ε⊗]≥f:α
Mv>>\DεNr∃aPPJ∧
FG/4
⊗2ε∀∞W≡/$
↔~εM|v>.D
⊗rε⎇dπ≡/l↑&∞b∞LW⊗n≥l⊗g~D¬π∨&≡NW~α∞]f∞nU∀εn∂⊃Q JαM⊗66↑$ε∞n⎇lrπ&]Rbα.W"α∞>F∂'↑4π/≡↑-⊗"J∞=ε␈.LDαε⊗T∞FF*∞<⊗n*a∀∧Nr∞Mε(h!∀α∧MJ4εNo
LVn.nL↔&N⎇dαπ&
≡2π⊗↑NW⊗w4∧π&FT¬eE,h→T*α≡2ε∞a≥⊗w&↑-f."≡F}n≤1PPJ∧∞7Nn-⎇Brα	mw⊗n≥MGJα∞Mε*αk
TtXTαεO4∞FF*∞<⊗n*∧↔~αjYdlT∧π>OM∧π'⊗≥≥FNvqQ JαM⊗>ON4π∨'-≡πε.D
v62a→↔"ε≡4απε}>6N⊗LUBεF}|W6/%Dπ&z<↔/≡T∩εV|$απ&t&(h!∀απ↔]dπ>OM∧ε
εM≤f6/,]g"αk
TtXUbα¬>\'∨O>LVjε≥m↔&N≥M↔V∂M≥vw~∞=ε␈.LDε≡F\=0hP∀∧π&FT∞W≡/-≤BαπMtε&/L↑&nNlTαπ>
≤6Bε≥m↔ Nm≥F/~∞Mrαπ↑<RpL≥dαπ&T¬$⎇∞5SQ!∩αε≥↑εf.\]g&∂M≥vrπM
↔~πMRπ&Tαt=IiS
ε≥lBαtzIdk∩λxU%$_$π6∂-≤⊗⊗f↑4αε∂4⊗ph!∀αε∂M⎇VN~∞?⊗n⊗⎇EBεNd∧π&F←∀ε/F≡>Bbε≥lBε␈MW↔>≡<PNO4∞FF*∞<⊗n*∧↔~α∞>F∂'↑1PPJ∧∞Vv∞\U∩rα∧	⊗rπMRα¬8→∀bα
≥Wεf]\Vw&≡M⊗}r∞MεO~∧
↔~πMRαπ<≥V*α≡2αG>L↔'/1Q Jα∞]f∞nU∃`hPQ-&v∞\Q∩αα∞>F∂'↑4εVv≥\RJα∞,W'/-n2π&TαεV|$εv∞\Tε∂~∧⊗rε≥nF/⊗l\Bαε≡MvnN4∞7Nn-⎇Bph!∀α¬&TεVv≥\Rε}a≤∩εV|$εO~∧∩π.m≡↔.*
≤F.wM≤fN/$f␈∩∧
↔"ε≥]vv:≥Fbα
|bπ&QPPJ∧∞W≡/$}2εV|.2pL≥dαπ&T∧M%4
⊗oεL]V.wL≡FN}d∞FFO4∧εO~∞Mε*ε-|"?~∧¬dTt→XRαpQ!∩α∧≥dπ&FTλD,~V⊗ααε≥↑εf.\]g&∂M≥vrπM
↔~ε≡4εvviI∃≥αD∧π>F↑,RεvmdεO_≡Mε*ε-| hP∀∧εw.\,W∩ε≥dε&.=≥V∞baQ hW
-f∞nQ∀ααG>L↔'/4∂εVv≥\RJε≥dπ&FT∧∧M%4
⊗oεL]V.wL≡FN}d∞&/'↑-g~πMRαu	)dlT∧ε∂~≥`hP∀∧εNwL↑&v.D↔&}]≤2απ?≥V⊗}Edα¬&
≡2αε≡4εv␈-\⊗fg∀∞FF*∧
f∞nT
v2α∞Mε*π∞-v?⊗≥QPPJ∧∞FF∂D∞FF*∞↑6/∩
≥g6}<\Bπ&t∧ε∨⊗\≡F*πM
↔~ε-|"rα
↑7.∞MO∩π&
≡2π>≥MBαε,Tπ&FQQ Jα∞<⊗n*≡2π&TεVv≥\Rbε.↑Bπ≡∀∞W≡/$6∞r
≥g6}<Tπ≡/l↑&∞b=wεN↑4ε}2∀ππ⊗|}&∞hQ!∩αε≡Dε}v<UBε.≤=αεF≡m⊗v:∀απ.m≡↔.*
-f∞nT'/"≥Fbε≡fNvt∞FF*∧∞6∞nT∂εVv≥\Rph!∀α∧Nd∧π&FTλD,~V⊗ααε≥↑εf.\]g&∂M≥vrπM
↔~α∞⎇⊗fb∞,W'/-dαπ&TαεV|$w~α.∞&}?,≥PhP∀∧εv∞\T"rα	⎇b∧o]NFN∨5DεO"∞=ε␈.LDπ⊗/N↑&rα∞>F∂'↑4ε∂⊗tεαJpQ!PW≡\⎇F}8∀∧αG∨L≡G/~∧∞6.>M|rJπ,↑G/⊗n4απ&Tεf}|≡&O&
TααF,≡6*β%∀αε}d∞FF*∧∞6OVT∧ε}2⊃PPJ∧∧'≡.⎇\Vw"%Dπ&FT∞VvOD
v2π>⊗≡*≥Ff}<≡FN}edααEMRπ≡∨,Rε}d∩π≡\⎇V.wD
f..AQ Jα
mw"ε,Tπ&FT∞6∞nT↔~πMRπ≡∨,Rε}d∩εn]]w↔J∞⊗>*e⊃PPh!Q hPQ!PTn≡,6Bβ5DβKw⊃⊂HJ∧∧↓≠~V∃cBs⊃⊃⊂Jα∧∧ααα
⊗>*ε5SK_Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hR∧∧¬&FTf}fM}vNvt∞7&∂N↑2ε7]l7&N⎇n2ε}mO∩ε/
≡7"ε≥dπ&FT	∃%~
≥Wεf]\Vw&≡M⊗}raQ hV≡N0Jα¬∞7&∂N↑2εON5∩π⊗↑NW⊗w4∩εf≡>Bαε|dε6OlTεO&]↑2αF|.F∞Nl\Bε7-⎇RαπMR¬≥:H∃%(Q!∩απ?≥V⊗}M≤2π∨≡>F.j8⊗fb↔!PPh!∀ααC∃∀α¬&Tαε∞]}Vw"
|bπ&≥\Rαε≥dπ≡.=⎇f'_≡]g&ND	∃%~
≡2αε⎇⎇⊗v:Mw>rD∧ε∂~⊃PPJ∧∧ααα∧ff}n]RbαV∃cαα
≤b∧MJ4αε&|↑6r?D∞εf∞d∞Fzα⎇rε&}⎇b`N}$αk∩f∧αεNd	∃%_Q!∩αα∧∧ααε≥N&.∞O∀εO~Mw>raQ hP∀∧αC∩∀∧ε
εm∨εw.T∞vFNe number of users logged in, as a fixnum.

	  (4)	the number  of	memory errors  the  system has	survived,  as a
	       fixnum.

	  (5)  the time in seconds the system has been up, as a flonum.
Some of  this information may  be of use  to a user  handler for  the sys-death
interrupt.

hactrn	  (status hactrn) returns an atomic symbol indicating what kind  of job
	  is superior to the LISP.   Current possibilities are ddt, LISP,  t (a
	  superior of unknown type), and nil (no superior).

   The following status functions exist only in the Multics implementation.

paging	  (status paging) returns  a list of  the paging-device page  reads and
	  total page reads that have been caused by this process.

arg	  (status  arg n)  returns  the n+1'th	argument of  the  command which
	  invoked  the subsystem,  as an  interned atomic  symbol.   (The first
	  argument,  (status arg  0), is  the name  of the  subsystem.)  nil is
	  returned if n is greater than the number of arguments to the command.

STATUS FUNCTIONS FOR THE WHO-LINE

   The following status functions exist only in the ITS implementation.

whol	  (sstatus whol a b c  d) sets four user parameters for  the "who-line"
	  which appears at the bottom of some display terminals.  These control
	  the print format of information specified by (sstatus who2), (sstatus
	  who3), and  (sstatus gcwho).	Each  of the four  parameters specified


Page 3-94			   ∪3-1.8.1			   March 3, 1979
				  The System


	  eight bits of information.  Parameters a and c must be fixnums; b and
	  d may be fixnums or  atomic symbols (which represent the  ascii value
	  of  the  first  character  in their  pnames).   Their  meaning  is as
	  follows:

	  a    200 If 1, suppress display of entire who-line.
	       100 If 1, suppress space between halves of who2.
		70 Mode for printing high 18. bits of who2.
		 7 Mode for printing low 18. bits of who2.

	  b    177  If	non-zero, print  between  halves of  who2  as  an ascii
	       character.
	       200 If 1, print character twice.

	  c    200 If 1, suppress space between who2 and who3.
	       177 As for a, but affects who3.

	  d    377 As for b, but affects who3.
	  That is, if  the who-line is displayed  at all, the  user information
	  appears in the form:

	  PPP##-QQQQ=RRRR@@+SSSS

	  where:

	  PPPP is the result of printing the high 18. bits of who2 as specified
	       by a's 70 bits.

	  QQQQ low 18. bits of who2, by c's 7 bits.

	  RRRR high 18. bits of who3, by c's 70 bits.

	  SSSS low 18. bits of who3, by c's 7 bits.

	  ##   zero to two characters, specified by d.

	  -    space, unless a's 100 bit is set.

	  =    space, unless c's 200 bit is set.

	  +    space, unless c's 100 bit is set.

	  The possible print modes are:

March 3, 1979			   ∪3-1.8.1			       Page 3-95
			   Maclisp Reference Manual


	  0    Do not print.

	  1    Date in packed form:

			 774000 Year mod 100.

			   3600 Month (January = 1)

			    174 Day of month.
	       Printed as mm/dd/yy.

	  2    Time in fortieths of a second.  Printed as hh:mm:ss.t.

	  3    Time in half-seconds, printed as hh:mm:ss.

	  4    Octal number.

	  5    Decimal number (no "." is printed).

	  6    Three sixbit characters.

	  7    Unused.
	  (status who1) returns a list of four fixnums  a b c d).

who2	  (sstatus who2 x) sets the who2 varaable to x if it Iq a fixnum, or to
λ  the sixbit valqe od the first six characters of the pname of x  if it
	  is a symbol.	(stadus who2 x) returns who2 as a fixnum.
¬
who3	  (sstatus who3 x! and (status who3) are analoeous tk those for who2.

Example:
↓  (adl numbers in octal)¬
	  (sstatuS who1 166 0 144 254	
↓  (sstatus who2 'FOOBAR)
	  (sstatuS who3 (+ (LSH 1234 22) 3456))
would cause "FOKBAR 1234,,3456" to appear in the who-line.  The geneRal idea iS
that the user should set up who1 hust once and then keep updating who2 and who3
as appropriate.  For Exaeple, a routing that processed fUnctions in files might
do
	     (qstatus who1 1Xl@`@Dll@`$~∃C]⊂A←\A=aK]R9NABA9KnAM%YJAI<~∀α@@@@QMgiCIUfAoQ<d@QG¬Id@QQec]C5JAS]→SYJR$R~∀∩@@@@!ggiCQkfAo!↑f@`$~∀
∃ACOJ@LZrl∩$∩@@@LfZb\`X	D$HI↓↓αnK∂!β→1↓EK9d4(0$$HI↓αSF)αOg∨#↔44Ph( (,≥f"ε⎇dε.v=}Vwε↑-⊗v:∀ε'.l>FN}dFxh!∀ααα∧¬π∂∨L≡G/~∞⎇ε{~mfv∞XU⊂hV≥lBπ≡q≤6}wM≥g.␈↑=GJεM≡7εf≥∀απ&Tε6NL]f∞nT⊗v ≤nVv∨M≥vrεl≥V*α,VNvt∞π⊗}<Z7≡.EaPT}lTε∞πl≥g&∞|Tαε}dF}Nlpαπ&
≡2ε␈l↑"ππ-≥g&Nlpλ∧∞~→(
≥Y[|M\=~3mdλ~<d∞~_=∧∧∪∩4j∧_x;AQ]<→≡→(≥m
k;∩-l(~3Lm|[8.M;{H↑Y;H∞M≠⎇9m∧~=λMy<{D}λ~_.l(_smn≤[{∧
yH≥
(_p↔[9wv2Kα


gcwho	  (sstatus gcwho n) sets the gcwho switchtk n.  Curpently only the low
	  two bits are significant.

   The t means  that during a  garbage collection	the who-line  should be
usurped to display  the message "GC:XXXX", where  "XXXX" is the reason	for the
garbage collection.  On completion of the garbage collection the  original user
who-line information is restored.

   The 2  bit means that  at the end  of the garbage  collection the  who2 word
should be altered so that the  low 18. bits get the result of  (status gctime),
converted to fortieths of a second, and the high 18 bits get the result  of (//
(* (status gctime)  100.)(runtime)), which is the  percentage of time  spent in
gc.  If the user gives 52 octal  and '% as the first two arguments  to (sstatus
who1), then these  quantities will be displaced  in the form  "nn% hh:mm:ss.t",
just like the standard system statistics for the LISP job.  The user  can still
use who3 for his own purposes.

   Subsystems which use (sstatus gcwho) should perform

      (gc)
      (sstatus gctime 0)
before	dumping out  the subsystem,  so that  the gc  time percentages	will be
accurate .

   (status gcwho) returns the value of the gcwho switch.

MISCELLANEOUS STATUS FUNCTIONS

evalhook  (sstatus evalhook t) enables the evalhook feature;  (sstatus evalhook
	  nil) disables it.  (status evalhook) returns the state of the switch.
	  See page 3-31 for the details of this feature.

toplevel  (status toplevel)  returns the top-level  form, which  is continually
	  evaluated when LISP is  at its top level.   If this is nil,  a normal
	  read-eval-print loop is used.


March 3, 1979			   ∪3-1.8.1			       Page 3-97
			   Maclisp Reference Manual


	  (sstatus toplevel x) evaluates and  returns x and sets the  top level
	  form to this value.

	  For example, to make Maclisp	have an evalquote top level  similar to
	  LISP 1.5:

	       (sstatus toplevel
			'(progn (print *)
				(apply (read) (read)) ))

	  See section 12.1 for further details.

breaklevel  (status   breaklevel)  returns   the  break-loop   form.   (sstatus
	  breaklevel x) sets this form.  See page 3-6 for how this is used.

uuolinks  (status uuolinks)  returns a	number which  represents the  number of
	  available  slots  for linking  between  compiled  functions.	(status
	  uuolinks) returns nil if no uuolinks pages have been set up  yet (see
	  pure).  Otherwise it returns a list of two items.  The first is  t if
	  area 2  has been  purified (and  so no new  calls may  be put  in the
	  area), and nil otherwise.  The second is the number of slots	not yet
	  used in the uuolinks areas.

	  (sstatus uuolinks) causes all links between compiled functions  to be
	  "unsnapped."	 This should  be  done whenever  (nouuo t)  is	done to
	  insure that the  interpreter always gets  a chance to  save debugging
	  information on every function call.

divov	  (status divov) returns the state of the "divide overflow" switch.  If
	  this switch is nil An attempt to divide by zero causes an  error.  If
	  the switch is  t the result  of a divisiOn  by zero is  the numerator
	  plus 1.

	  (sstatuS divov x) sets the "diviDe overflow  switch to x.

	  In the PDP-10 implEmeftation, divov applies only tk quotient.  /- and
↓  //$ do not detect divisiOn by zero.
¬
Mar↓  (sstatuc  mar  cond  loc)  arms  the	mar  (memory  address register)
	  interrupt  (currently  available  only  in  the  ITS implementation).
	  (status  mar) returns  a list  of cond  and loc,  or nil  if↓the mar
	  feature is not  in use.  See the  mar break feature for  more details
	  (page 3-55).

Page 3-98			   ∪3-1.8.1			   March 3, 1979
				  The System


features       (statuS	features) returns  a list  of symbols  representing the
	  features implemented in the  LISP being used.  The  following symbols
	  may appear in this list:

	       bibop	     PDP-10 big-bag-of-pages memory management scheme

	       lap	     this LISP has a LISP Assembly Program loaded

	       sort	     the sorting functions described in chapter  11 are
			      present

	       edit	     the  edit	function  described  in  chapter  18 is
			      present

	       fasload	     the fasload  facility described  in chapter  14 is
			      present

	       ↑f	     the "moby I/O" facility is present

	       bignum	     the  arbitrary-precision  arithmetic   package  is
			      included in this LISP

	       hunk	     the hunks data  type and its  associated functions
			      are present.

	       funarg	     the  "fake  funarg"  feature  (second  argument to
			      eval, third to apply, etc.) is present.

	       strings	     character	strings  and  the  functions   on  them
			      described in chapter 8 are present

	       newio	     the  I/O  functions described  in	chapter  13 are
			      included	in this  LISP; if  this feature  is not
			      present	only  some   of  those	 functions  are
			      available.

	       roman	     this LISP can  read and print roman  numerals (see
			      base and ibase.

	       trace	     the trace package (chapter 15) is present.

	       grindef	     the function definition formatter (chapter  16) is
			      present.

March 3, 1979			   ∪3-1.8.1			       Page 3-99
			   Maclisp Reference Manual


	       grind	     the file formatter (chapter 16) is present.

	       compiler      this is the LISP compiler (chapter 14) rather than
			      the interpreter (see also compiler-state).

	       fastarith     the fast-arithmetic  features of the  compiler are
			      present

	       ml	     this LISP is on the MathLab machine at MIT

	       ai	     this LISP is on the AI machine at MIT

	       mc	     this LISP is on the MC machine at MIT

	       SAIL	     this LISP is running at SAIL

	       H6180	     this  LISP is  on an  H6180 Multics  machine  or a
			      compatible machine such as a 68/60 or a 68/80.

	       its	     this LISP is on some ITS system

	       Multics	     this LISP is on some Multics system

	       TOPS-10	     this LISP	is on  some DEC  TOPS-10 system;  or on
			      some TENEX system since the  TENEX implementation
			      runs under a TOPS-10 emulator.

	  A package  being "present"  means that  it has  been loaded  into the
	  environment.	If (status features)  claims it is not present,  it may
	  still  be  available	because it  may  be  automatically  loaded when
	  required.  This does not apply to the compiler.

	  (car (last (status features))) is an implementation name, such as ITS
	  or TOPS-10 or Multics.  The main idea behind this status call is that
	  an application package can be loaded into any  Maclisp implementation
	  and can  decide what	to do  on the  basis of  the features  it finds
	  available.

feature   (status  feature foo)  is roughly  equivalent to  (memq  'foo (status
	  featuRes)), i.e. it determines whether this LISP has the foo-feature.
	  Note that foo is not evaluated.



Page 3-100			   ∪3-1.8.1			   March 3, 1979
				  The System


	  (sstatus feature  foo) makes	foo a feature.	 foo is  not evaluated.
	  For example, the trace  package does (sstatus featuRe trace)	when it
	  is loaded.

	  Example:

	     (cond ((statuS feature bignum)
		    (prog2 nil (eval (read)) (read)))  ;use first
		   (t (read) (eval (read)) ))	       ;use second

	     (defun factorial (n)    ;bignum version
		 (cond ((zerop n) 1)
		       ((times n (factorial (sub1 n))))
		   ))

	     (defun factorial (n)    ;fixnum-only version
	      (do () ((not (> n 13.)))	;do until n <= 13.
		     (error "argument too big - fActorial"
			    n
			    'wrng-type-arg))
		 (cond ((zerop n) 1)
		       ((* n (factorial (1- n)))) ))

nofeature (sstatus  nofeature foo)  makes foo  not be  a feature.   foo  is not
	  evaluated.

	  (status nofeature foo) is equivalant to (not (status feature foo)).

status	  (status status foo) returns t if foo is a valid status  function.  If
	  it is not, nil is returned.

	  (status status) returns a list of valid status functions.   The names
	  are truncated to some implementation-dependent number  of characters,
	  such as 4 or 5.

sstatus   (status sstatus foo)	returns t if foo  is a valid  sstatus function.
	  If it is not, nil is returned.

	  (status sstatus) returns a list of valid sstatus functions.	As with
	  (status  status), the  names	are truncated  to  some implementation-
	  dependent number of characters, such as 4 or 5.



March 3, 1979			   ∪3-1.8.1			      Page 3-101
			   Maclisp Reference Manual


1.8.2  Time


runtime		    SUBR no args

	  (runtime) returns as a fixnum the number of microseconds of  cpu time
	  used so far by the process in which LISP is running.	 The difference
	  between two values of  (runtime) indicates the amount  of computation
	  that was done between the two calls to runtime.


time		    SUBR no args

	  (time) returns the time in seconds that the system has been up,  as a
	  flonum.   The difference  between the  results of  two calls	to time
	  indicates   the  amount   of	elapsed   real	time.	 (In   the  ITS
	  implementation, time that elapses while the system is stopped  due to
	  memory errors is not considered "real" and not counted.   Use (status
	  daytime) to measure true "real world" time.)


sleep		    SUBR 1 arg

	  (sleep n) causes a real-time	delay of n seconds, then returns  n.  n
	  may be a fixnum or a flonum.


See also the alarmclock function, section 1.4.3, and the date, daytime, and dow
functions of the status special form, described in the preceding section.


1.8.3  Escaping from LISP


   It is possible to escape temporarily  from LISP to execute a command  in the
host operating	system.  Of  course, the  program (or  user) that  supplies the
command has to	know which operating  system it is  running under.  It	is also
possible for  LISP to return  permanently to the  host operating  system.  This
discards  the  LISP environment  and  gives back  whatever  resources,	such as
memory, it was using.




Page 3-102			   ∪3-1.8.2			   March 3, 1979
				  The System


			 in the Multics implementation

cline		    SUBR 1 arg

	(cline x), where x is a character string, executes the	MulTics command
     x and returns nil.  Example:
			      (cline "who -long")

quit		    SUBR no args

	(quit) Returns from the LISP command, freeing up the temporary sagments
     thatwere used to hold the LISP environment.


			   in the ITS implementation

valret		    LSUBR 0 or 1 args

	(valret) does a .LOGOUT if LISP is a top level procedure, and othersise
     valrets ":VK   to DDT.

	(valret x) effectively performs an explodec on x (in practice x is some
     strange atomic  symbol like |:PROCEED  :DISOWN |  , But it  may be  any S-
     expression).  If the string of  characters is one of "$↑X.", ":KILL  ", or
     ":KILL↑M"	then valret  perfkrms  a "silent  kill" by  executing  a .BREAK
     16,20000; otherwise valret performs a .FALUE, giving the  character string
     to DDT to evaluate as commands.

	Examples:

	(valret '|:PROCEED :DISOWN |)

	starts the LISP running on its own without a terminal.

	(valret '| :KILL :TECO↑M|)

	kills the LISP and starts up a TECO.
¬
	(valret '0$N$P)

	causeq DDT to print out The c@=]iK]QfA←L↓CYXA9←\[u∃e↑AY=GCiS=]f∪S8A→∪'@~∀@@@AC]⊂AiQK8AeKiUe\Ai<A→∪'@\~∀~(~∃≠CIGP@f0@brnd∩∩∩@@&fZDXp\f$∩∩@@@@A!¬OJ@f4b`f~(_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∀∪∪_AiQJ%mCYe∃hAG←5[C]H↓YKCm∃f@As=jAS\↓		(@Q←dA¬]soQ∃eJA←QQKd@↓iQC\↓iQJ~(@@@@↓→∪' $XAB@iπ∨≥)%≥+
@↓←d@I@AG←[5C]H∪Q↑A		PAoSY0@AeKQke\AQ↑AiQ∀@A→∪M XAo!SGP~(@@@@↓oSYX↓iQK\↓eKikI\@AMI←ZAi!JAGC1XAi↑AmCYIKh\@↓⊃←oKYKdXAYCYeKP@AIS→MKef↓Me←Z4∀@@@AgkgAK]HA%\Aio<AoCsLt@@A%hAI←∃fA]←PAGQK
VAM←H@A←a∃\AMS1KfXA¬]HASP@AI←∃fA]←P~∀@@@ACYQKdAi!J∪gi¬eiS]≤ACIIIKgf@↓←LAi!J@A→%' \@↓∪L@Ae←jAkMJ@Am¬YeKh↓i↑@A⊃k[`A∧~∀@@@Agk	gsgi∃ZXAi!K\AgQCeiS9NAk`↓iQJAMkEgsMiKZA
CkgKLABAe∃ike\↓i↑Ai=`AYKYKXAC9H~∀@@@Ai!JAG←9gKck∃]h@A∃mCYk¬iS←\↓←L@AQQJAi=`[YKYKXAKIeYSgP@@Q]=hAiQ∀@AES9IS]N↓←L~∀@@@A∃eeYSMh@AS8@AKM→KGhA¬h@Ai!J@Ai%[J∪←_AiQJ%mCYe∃hBR\@A+g%]N@AMkgaK9HXAi!J~∀@@@AgUEgsgQKZAgQCeik@A[Ke∃YrAG¬kgKf↓BAeKQke\A→e←ZAQQJAgUgaK]⊂AMk]
iS←\8~∀~∀4∀∩∩∩↓S\Ai!JA)∨A&Zb`↓S[aY∃[K]i¬iS←\4∀~∀∪QQKeJ↓SfAGUeeK]QYrA]<@AoCdAM←d↓→∪' ↓i↑∪e∃ike\↓BAG←5[C]H↓gieS9N@Ai<AiQJ4∀@@@A≠←]%i←d@↓S\Ai!J@A)=!&Zb@@AS[AYK[K9iCiS=\\∪⊃=oKmKHX@@QYCYeKPR@Ao%YXAe∃ike\4∀@@@AG←]Qe←XAQ↑AiQ∀A[←]%i←dAM↑AiQ¬hABA
←[[C9HA[CdAEJA5C]kC1YrAieaKH\A)QK8Aisa∀~∀@@@Aπ∨9)∪≥+∀Ai↑AIKgk[∀A→∪'@\~∀~(∪)QJAeK[¬eWf@↓CE←m∀@ACE=kh@AYCYeKPAC]H%gkga∃]H@A!←YH@↓M←d@↓iQJAQ∨!&ZD`~∀@@@AS5aYK[∃]iCi%←\AC1g↑\~(~∀~∀D\p\hAβII%iS←]¬XA
k9GiS←9f~∀~(~∃gk	d∩∩@@A'+	$@bA¬eN~∀4∀∪)Q∀ACeOU[K]h0ABAM%q]kZ0ASfAQCWK\↓i↑AE∀AiQJ↓CIIe∃gfA←_ABAY=GCiS=\AoSQQS\~(@@@@↓BAG←5aSYK⊂A←dAMsgiK4AMk]
iS←\8@Agk	dACiQK[aiLAi↑A⊃KiKe5S]JAQQJA]¬[JA←_AiQJ4∀@@@AMk]
iS←\AErA≥e←mK1S]N@↓iQe←UOP@AQQJAGUeeK]P@A←E¬eeCr↓Y←←W%]N@A¬h∪CY0AiQJ4∀@@@AG←[ASYKH↓Mk]GQS←\AAe←aKIiSKf8@A∪L↓Sh@A→CSYf↓ShAe∃ike]L@D}D8@A)Q%f∪Sf↓kgKH4∀@@@AErA	CWie¬GJXA→←d@A∃qC[a1J\@AQQSfA→k]Gi%←\A[¬r@AE∀AkgK→kXAi<@Akg∃dAQC9IYKeL~∀@@@AM←HAiQJ↓[CGQ%]J[KIe←dA%]iKeIkahX↓M←dA∃qC[a1J\~∀$A)QJ↓M←YY=oS]N↓Mk]GQS←\A∃qSgiLA←]YdAS\AQQJA∪Q&AS[AYK[K9iCiS=\~∀~)gsgG¬YX∩∩@@A→M+¬$@HAi↑@D`ACe≥f~∀~(∪)QSL@AMk9GiS←8ACYY=of@AQQJ@A1∪' AUgKd@↓i↑AI%eKGi1r@ASMgkJ@↓∪)&AMs[E←1SF~∀@@@AMsgiK4AGCY1f\@AQQJAM%eghA¬eOk[∃]hAg!←kYH↓EJ~∀$∩∩@@@@@@ V@QYMPAF@Dp\RA8R~∀~(∪oQKIJA\A%f@Ai!JAIKMSeKH↓]k[E∃d∪←L↓←kiaUhAmC1kKf@↓C]HAASf@↓iQJA
←]ie=X~∀~(~∃!C≥J@fZD`h∩∩$@@@&LZb\p8f∩∩∩@A≠CIGP@f0@brnd~∀_∩∩∩$@A)Q∀A'sgQKZ~∀4∀~∀@@@AE%ifAM=dAiQ∀AGCY0\@A)!J@Ag∃G←]H↓CeOk5K]hAMQ←kY⊂AEJA¬\ACi=[SF@↓gs[E=XAoQ=gJ~∀@@@AA]C[J↓Sf@AQQJA]¬[J@A=LAiQ∀@A∪)LAgsgQKZ@A
CYX\A)QJAeKgPA←L@↓iQJA¬eOk[∃]if~(@@@@↓gQ←k1HAEJ↓iQJA%]akh↓CeOk5K]if↓M←dAQQJAG¬YX\@↓β\ACIOk[K9hA[CdAEJ@↓BAMSa]kZX4∀@@@A←dA∧AMSY∀A←EU∃Gh@@!M←dA]QSGP↓iQJA→SYJOL@AGQ¬]]KX↓]k[E∃dASf↓kgKH$\∩A∪_AiQJ4∀@@@AGCY0AgkG
KKIf0ABAY%ghA←_A\@A→Sq]k5fASf↓eKikI]KH\A∪LA¬\AKeI←d@A=GGkeLXAiQ∀~∀@@@A∪)LAKee=dAG←⊃JASf↓eKikI]KHA¬fABA→Sq]k4\~∀~(∪qC5aYJt@@QgegGCY0@`@OMG[XAQsR@f$~∀∩@@@Ag∃ifAi!JA]k5EKdA=LAKG!↑AYS9KfAM=dAiQ∀Aiir↓i↑@f↓C]HAIKike9f@A]%XA←\4∀∩@@@Agk
GKgf8~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~)≠CeG @fX@Drnr∩$∩@@@LfZb\`\h∩∩$@@@@A!CO∀@fZb@j~∀_∩∩∪ACeh@P@ZA)!JA→∪M Aπ←5aSYKH~∀~∀4∀~∀b8@A!K
kYSCISiSKLA←LAQQJAπ=[aSY∃d~∀~(~∀@@↓→∪' ↓ae←OIC[fA
C\AE∀AG←[ASYKHAS]i<A[CG!S]JA
←IJ\A)QSLAeKaIKgK]QCiS←8@A←L↓B~∃aI←OeC4ASfA5←eJA
←[aC
hAiQ¬\AiQ∀AS]i∃eaeKQKHAY%gh[gQekGiUeJAe∃aeKg∃]iCi%←\XA¬]H~∃%hAGC8AEJA∃qKGkQKHA[UGPA[=eJAcUSGWYd\@A⊃=oKmKHXABAAeSGJ↓[kgh↓EJAa¬SH@A→←dAi!KgJ~)EK]K→Sif\A∪hA%fA]←PACfA∃CgrAQ↑AS]QKemK9JAS\↓iQJA∃qKGkQS←\A=LAG←5aSYK⊂Aae←≥eC[f4∃CfA%h@ASLAoSi ∪S]i∃eaeKQKHAaI←OeC5f\@AQQkf@↓[←gh↓→∪' %ae←OIC[fAMQ←kY⊂@A]←PAEJ~)G←[a%YKHAU]iSX↓CMiKHAiQKdAQCm∀AEKK8AIKEUOOKH8~∀~∀@A∪\ACII%iS←\0A]←hACYX↓→∪' %ae←OIC[fA
C\@A	JAG←5aSYK⊂\@@AQQKeJACeJ↓GKei¬S\~∃QQS]OL∪oQS
PAGC8@AEJAI←]∀AoSi @AiQ∀@AS]QKeae∃iKdAQQCh@↓GC]]=h@AE∀AKMM∃GiSm∃Yr~∃
←[aS1KH\@↓)QKg∀AS]G1kIJ@↓S]ISMGeS[%]CiJ↓kgJA=L@Ai!JAMk9GiS←9fAKm¬X@AC9HACaAYrX~)KgaK
SCYYd@AoSQPAaI0[a←S9iKd@↓CeOk5K]ifl@E]←9Y←GC0D@AkMJA←LAiQJ↓O↑@A¬]HAe∃ike\4∃Mk]
iS←]Lv@AMU]GiS=]fAo!SGP@↓[←IS→r@Ai!K[gK1mKf\AβYg<∪iQKIJACe∀@AB@↓]k[E∃dA←L4∃Mk]
iS←]LAoQS
P@AI∃iKGh↓SYYK≥CXACIOk[K9if@A]QK\AQQKrA¬eJ@A
CYYK⊂AS]i∃eaeKQSmKYd~∃EkPA]←h↓oQK\↓BAGC1XAi↑↓iQKZ↓SfAG=[aSY∃HvAi!KeKM=eJAKroneous  compiled programs
can damage  the LISP environment  and can  cause strange errors  to occur  - be
forewarned.  However, most "normal" programs are compilable.

   Some operations are	compiled in such a  way that they will	behave somewhat
differently  than  they  did  when  they  were	interpreted.   It  is sometimes
necessary to  make a  "declaration" in	order to  obtain the  desired behavior.
This is explained on page 4-11.

1.1  Variables


   In  the  interpreter "variables"  are  implemented as  atomic  symbols which
possess shallow-bound value cells.   The continual manipulation of  value cells
would decrease	the efficiency of  compiled code, so  the compiler  defines two
types  of  variables:	"special  variables"  and  "local  variables."	Special
variables are identical to variables in the interpreter.

   Local  variables  are more  like  the variables  in	commonly-used algebraic
programming  languages	such  as  Algol  or  PL/I.   A	local  variable  has no
associated atomic  symbol; thus it  can only be  referred to from  the function
that possesses	it.  The compiler  creates local variables  for prog-variables,
do-variables, and  lambda-variables, unless  directed otherwise.   The compiled
code  stores local  variables in  machine registers  or in  locations  within a
stack.

October 2, 1979							       Page 4-1
			   Maclisp Reference Manual


   The principal difference between local variables and special variables is in
the way a  binding of a  variable is compiled.	(A  binding has to  be compiled
when a prog-,  do-, or lambda-expression  is compiled, and  for the entry  to a
function  which has  lambda-variables to  be bound  to its  arguments.)  If the
variable to be bound has been  declared to be special, the binding  is compiled
as code to imitate the way  the interpreter binds variables:  the value  of the
atomic symbol is saved and a new  value is stored into its value cell.	 If the
variable to be bound has not been declared special, the binding is  compiled as
the  declaration of  a new  local variable.   Storage is  assigned and	code is
generated to  store the value  to which the  variable is to  be bound  into the
register  or stack-location  assigned  to the  new local  variable.   This runs
considerably faster than a special binding.

   Although a special variable is associated with an atomic symbol which is the
name of the variable,  the name of a local  variable appears only in  the input
file;  in compiled  code there	is no  connection between  local  variables and
atomic symbols.  Because this is so,  a local variable in one function	may not
be used as a "free variable" in another function since there is no way	for the
location of the variable to be communicated between the two functions.

   When the usage of a variable in a program to be compiled does not conform to
this rule, i.e. it is somewhere used as a "free variable," the variable must be
declared  special.   The  necessary  special  declaration  of  such  a variable
provides a convenient place to	put a comment explaining and and  defending its
non-local usage.   There are  two common cases	in which  this occurs.	 One is
where a "global" variable  is being used, i.e.	a variable which iq  setq'ed by
many functions but Is never bound.  The other is where two functions cooperate,
one binding a variable and then cAlling the other one which uses  that variable
as a free variable,















Page 4
2			    ∪4-1.1			 October 2, 1979

α
1.2  In-line (or OpEn) Coding


   Another  difference betweeN	the compiler  and the  interpreter  is "in-line
coding," also called "open coding." When a form such as (and (foo x)  (bar)) is
evaluated by the  interpreter, the built-in function  and is called  to perform
the desired operation.	Bqt to compile this form as a call tk the  function and
with list-structured arguments deriveD from (foo x) and (bar) would negate much
of the advantage of compiling.	Instead the compiler recognizes and as	part of
the LISP language, then compiles machine  code to carry out the intent	of (and
(foo p) (bar)) without actually calling the and function.  This code might look
like:

		pick up valua of variable x
		call funcTion foo
		is the result nil?
		if yes, the value of the and is nil
		if no, call the fUnction bar
		the result of the and is what bar retqrned.

This "in-line coding" is done  for all special forms (cond, prog,  and, errset,
setq,  etc&); thus  coMpiled code  will usually  not call  any of  the built-in
fsubrs.
¬
   Another difference between the compiler  and the interpreter has to	do with
arithmetic operations.	 Most computers  on which  Maclisp is  implemented have
special instructions for performing all the common arithmetic  operations.  The
Maclisp compiler  contains a  "number compiler" feature  which allows  the LISP
arithmetic functions to be "in-line coded" using these instructions.

   A problem arises  here because of the  generality of the  Maclisp arithmetic
functions, such as plus, which	are equally at home with fixnums,  flonums, and
bignums.  Most present-day computers are not this versatile in their arithmetic
instructions, which would preclude open-coding of plus.  There are two ways out
of this problem: one  is to use the  special purpose functions which  only work
with one kind of number.  For  example, if you are using plus but  actually you
are only working with fixnums, use + instead.  The compiler can compile (+  a b
c) to use the machine's fixnum-addition instruction.  The second solution is to
write a form such as (plus a b (foo c)), but tell the compiler that  the values
of the	variables a  and b  and the  result of	the function  foo can  never be
anything but fixnums.  This is done by means of the "number declarations" which
are described on page 4-11.


October 2, 1979			    ∪4-1.2				Page 4-3
			   Maclisp Reference Manual


   Another problem  that can  arise in	connection with  the in-line  coding of
arithmetic  operations	is that  the  LISP representation  of  numbers	and the
machine representation of numbers may not be the same.	Of course, this depends
on the particular implementation.  If these two representations  are different,
the compiler would store variables which were local and declared to be numeric-
only in  the machine  form rather  than the  LISP form.   This could  result in
compilation of poor code  which frequently converts number  representations and
in various other problems.  Compilers which have this problem provide a (closed
t) declaration which inhibits open coding of arithmetic operations.



































Page 4-4			    ∪4-1.2			 October 2, 1979


1.3  Function Calling


   Another  property of  compiled code	that should  be understood  is	the way
functions  are	called.   In  the  interpreter	function  calling  consists  of
searching the property	list of the called  function for a  functional property
(if it is  an atomic symbol)  and then recursively  evaluating the body  of the
function if it is an expr, or  transferring control to the function if it  is a
subr.  In compiled  code function calling is  designed according to  the belief
that most of the functions called by compiled code will be  machine executable,
i.e.  "subrs":	 other	compiled functions,  or  built-in  functions,  and only
infrequently  will compiled  code call	an interpreted	function.   Therefore a
calling  mechanism  is	used  which  provides  for  efficient  transfer between
machine-executable  functions  without constant  searching  of	property lists.
This mechanism is called the "uuo link" mechanism for historical reasons.

   When a compiled function is first loaded into the environment, it has  a uuo
link  for each	function  it wilh  call.   This uuo  link  contains information
proclaiming that it is	"unsnapped" and giving the  name of the f∃nction  to be
called, which iq an atomic symbol. The dirs@PAiS[∀ABAG¬YXASLA[CI∀@AiQI←kOP↓ckGP4∃BAkU↑AYS9VPAi!JAMβ
hAiQ¬hASh↓Sf@EU]g]CAaKHD↓SfAe∃G←O]%uKHA¬]HAB↓caKG%CXAY%]WS]≤~∃e←UiS]J↓SfAK9iKeK⊂\@A)!SfAe=kiS]∀AgKCIGQKf↓iQJAAeWaKIibA→%chA←_AiQJ↓I`↔;≤εFN}d
Fxh,,Rε≡≥IF."@
⎇zz3LT→[`→λ0P# 5nctionadAeWaKIib@Q=`AC\↓Cki←1←CHAAa←aKIibR∪αK9β+/≠P$.Mε*π<≥V*α∞|↔Jε_4π&FT∧εNwLZ'π⊗↑LWαπ⎇x
-L	Hλ	≤β⊂⊂*~2P3unctiOn teRns  Out to  be an~∀∃qadX↓←dA∪β→βWh	→,@4s2@$,	the inteppreTer @Sβ→βGO,!↓βSzβπCCdπ∩π&Tε'9X`~~ww∧p[2⊂:4→FE92\zv: is given  backt`∞Ai!J@AG=[aSY∃HAG↑α#∃)↓¬##∃↓∧c';-∧K@~εL\gαα∧.Vw≡l≡πε.D$π≡xQ*FF∂@λW6//∀απ&≥\Rπ&
~2αεnYf∨&≥ybεO46∞fL\BαπMRεNnLW↔π,↑F/∩∧
vNfD&*α
⊃g6}<XBπ&qQ&NwLZ'π⊗↑DεO'4λF.6≥m↔&N⎇ebαα	_bbε
}v/6↑!Bπ&Tαε7]l7&N⎇dε⊗.≥lrε≡≥MF."∧	↔
ε\≤6FNlQPV/X7/&≤-F*α¬⊂O∨\."J@λ≥~Tλ≠∀[5P⊂4\P⊂⊃9[0x8"Y↔⊃⊂⊂⊃|0qz≠<P⊂;Z0z⊂⊂≥44yPλ6rpw≤P4yFB4vx6→vrw:_z4wwλ22x2[22w:λ1:z⊂≥42P2Y32qzλ4yP:~0z⊂3≤7vP7≠{P7wλ;t2w→{2y⊂_Dqpv≠⊂4yFB6pr2H:497]st⊂:~4yP:]wP64[5P⊂1[w:97[⊂;tv≠⊂12P≥90w9Y2y92Y⊂24y→qz6<H:7P⊂≥42P1Xv62rβE3:w_z4wwλ:ytw→P:42H9zq9≠zz4w→Vqpv≠4w3Pλ4w9z≤:qz4[w⊂7sλ:42P≠pqt4[2V⊂⊂_w2⊂7→tz42\εE:4→P64w~tw3P≤7zz4[2P77\⊂:42H4w:2\892z→y⊂;t[6⊂12H1pv6→r↔εEβE⊂⊂⊂∃42y2H4yP0H360sH;t4qZ⊂1pwλ12P⊂≤rz⊂9[P:40]⊂64w~yP;t[6⊂77]⊂12P≤w0x8→r∧r{→w⊂4sβE:42↑P3wP≥7P0P→:w1z~ww⊂;Z4qt⊂λ4yP6Xqt4w→P2|2Xzz0q≠2W⊂⊂∃44yP→60sP~yP:4→P⊂;0[:rP7YεE:4→P0z7[tqP9↑vq7vλ⊂77z]wW⊂⊂
)rrP≤0y:⊂W~W∀H⊂*42\2P4yH0v9wH0P⊂3≥w1z4[w⊗⊂∀≤yz0z≥yFE:]wv4w~yTV⊂≥t4qtλ:w9w_x9P⊂_v6⊂:~2P64[5yP⊂~w⊂:4→P2w;~y7w6Yw:↔⊂λ⊂*42\rP30Xtv4z~ryFE_y2P:\rr⊂⊂~w⊂1t\1zvy]0w1r\P9zqZ⊂⊂0yH;t2wλ0P⊂1[vx4v→r⊂3:[1z4w[⊂4yPλ92r2Y4w2r⊂7yεB1wvx~v2r⊂_wr2P~yP12Zw3P:≤0qrrλ7y⊂7]42y;ZyrP2→q:ssYr↔εEβE⊂⊂⊂∩w⊂:4→P⊂82≤⊗XX⊂~vx62[rw:0]4ww⊂_P⊂:z[P64w~P4yPλ4vx6→vrw:→r⊂0yH⊂0w⊂~w9z9≥qz4w[εEεEβE'qz≠q2y⊂⊗⊂_\M\DDDH⊂⊂⊂	M⊗XW→BDDDh_srP~ZFEβ∧DDPλ⊂&pq[4yx⊂∀2s2y→w1rP∪pw:p[εEεEβE;t4Xt⊂4yH2|2q]z2r⊂≥t2w⊂_P1pv≠⊂⊂4yH:7P1→P6pr→P:49≠zst⊂≥42P6~w5W∧H w⊂⊃≥w9w0\82r⊃βE64w~P1ww≤tyz9H7s⊂⊂_P9x2Xtpv⊂~w9z9≥qz4w[⊗⊂⊃*UgQ⊗⊂λ;t4qZ⊂1pz\ryP:~2P⊂&∩ih⊂6~w5tw→FE97]z4w2H4w⊂:~2P4w≥2y89→z2y⊂≥7P12H⊂1pv≠2r↔⊂λ*42P_r292\yP34Yv2⊂7Y⊂:42H⊂:zwH87tw≥9FE:≠P:42H0z7vZqP9|[q7v⊂≥t4qtλ70vr\P:42H3:w1]4ww⊂≥7P12H1pv6→r↔⊂⊂∃42P7\2y0z~ww⊂1[r2FE_w2⊂0Xqzvz[0z7yλ34rv→9P4w→4qpz→P:42H:<x2H7s⊂1Xv6⊂0[2⊂7:[q2y⊂≠s⊂0y→zvrw≥9W⊂⊂∃t2wεB:42P≠4w5P~yP9w_x82rλ:42P∃jgP4[9z9:Xz4wwλ4yP9→x60qYr⊂;t]4⊂0Pλ(*id∩⊃⊂4w≤z9:q]4ww⊗βE;t4Xt⊂4yH:42P≠pqt4[2P4w≤z9:q]4ww⊂→7y⊂1Xv64w→P9zq≤7zz4[2yWεBεE⊂⊂λ$w⊂:~2P&z[:4qyH4vx6→vrw:_z4ww⊂0P⊂≥zwP6~w5P4\P4vx≠2vrw≥2r⊂0\P0P⊂≤7tw:→y↔⊂⊂∃7FE1Xv6⊂:~97zsZ⊂:44\P⊂64[5P0Pλ:9x1≤⊃⊂4w≤z9:q]4ww⊂λ4w24\2qz⊂≥497zYt⊂:4→P⊂87Zw:2yλ4yFE≥yrr↔λ⊂ w⊂≥w9w0\82r⊂≠4w5P≤7tw:≤P0z⊂≥42P6~w5tw→P9zq≤7zz4[2P0w→⊂;0y~wzyP→4rv2≤P4wεB:42P≤7tw:→y⊗⊂6→s:⊂:[:yrrλ1<P:~2P⊂6Xqt4w→V⊂4w→4qpz→P:42H:<x2H7s⊂1Xv6⊗⊂λ7:vq→y⊂7sβE0y3]vrw:≤V⊂0w→⊂:42H⊂0z7[tqP9↑vq7vλ;t4qZ⊂70vYyP⊂:~2P3:[1z4w[↔⊂⊂+Z2w⊂:~2Dv4[5P4yCE9w0\82r⊂≥42P8≠tw:2\⊂4yP_t0w3Yr⊂:7H87tw≥⊂0z⊂≥42P3~y9z⊂~w9z9≥qz4w[⊂7s⊂λ:42P_pv62YεE3:[1z4w[↔εEεB⊂⊂⊂!→s7y2H0P3:[1z4w[⊂1pwλ12P:\rr⊂4]⊂6zy]⊂12P≠pr2P~w7{wλ4w⊂:~2P&$Th⊂2w≥4y7w≠rw:↔βE$w:→y892]2r⊂3≥w1z4[w9P0\2P6pY2P5w≠{w⊂9Zvx6<H1<P8≥z:4w→P0P3≥w1z4[w0v⊂≤97x2\:<P7[εE:4→P⊂89≠x2y:≡P64y]⊂⊂7sλ:42Pλ0z7vZqP9|[q7v⊂λ;t4qZ⊂70vYyDz4→P3:w_z4ww∧j44\P4yFB:yzp[6<P2≠w2P⊂≥ytw3H:42Pλ1:tv≥⊗tw⊂→:w1z~ww⊂2→s:w↔λ⊂⊂!w[x4v2Y⊂3:w_z4ww≤Dvzy]⊂12FB6pr2H⊂5w7]w⊂1<BpP6w\2Dqw[x62|λ6rqt_w4yvH⊂5w7]w⊂0yH⊂⊃67Xr4w3K⊃⊂12XpzyrH⊂7s⊂≥42FE_wvx6→|4z<H7s⊂:~2P9z\87y:λ6rqt_w4yv\P72rY2r⊂:≠P6puYP1wv\4v2rλ⊂3:w_z4ww≤P2|2Xzz2FB2s34Xtrw:≠<W⊂⊂∩w⊂⊂9[vrP2~pv2q]9P⊂7Y⊂&$iT⊂:42H⊂1wv\4v2yλ0zz7[pz4qXv6<Pλ6pur\P:42CE1wv\4v2rλ3:w1]4ww9Hthe compiler  creates a file  in the
file system of the host operating system, and this file has to be loaded before
the compiled function can be called.  In the pdp-10 implementation this file is
called a  "fasl file." In  the Multics implementation  it is called  an "object
segment." Loading is described in detail on page 4-17.
















Page 4-6			    ∪4-1.3			 October 2, 1979


1*4  Input to the Compiler


   The input to the compiler consists  of an ascii file containing a  number of
S-expressions.	The format od  this file iS such that  it could be read  into a
LISP environmeft using a function such as lkad or uread, and then the fUnctions
defined in this file would be executed interpRetively.

   When a file	ic compiled, the  compiler Reads succeqsive  S-expressigns from
the file and  processes them.  Each iS	classified as a function  definition, a
declare,  or  a "random  foRm"↓according to  what  type oF  object  it  ipεAC]⊂~∃CG
←eIS9NAi↑↓SifA
CdAS_AShAαKEβ¬∧c'OQph(4)α↓α¬β5+;∂SN{9↓β&+∪';LεFN}d
↔4λ_(m|[(∧∞z≠|lT_x<D∧~<hL9];D∧≠|HL9\≤M}B(	≤H≥~Q"Y]-l⎇~;md→→9M≥Y<h∀≠88n-kλ∃
(≠8,>[h~.4→→9M≥Y9λm|H≥.<(_=∧{{<
≥→(≥
≥9+H∧∧∩9H
≡β"Y\Z;Y.4_;H←≤≤H
}H_(L>≤≤ED≥~→${{<
≥→<H∞NX;\mL=→<d∞~→(L9Z;M≡~;{D\[{$	∩4t∧∞≠c"M\8z~-l(_{lL(_;LD≠⎇=∞∞=≤h
≡λ~;NMhλ≥
(λYL≡{λ→M≥→(H
}Hλ[l-Y8⎇∧∞y9{,]]λ@∧∞z~8m∧~<c!.~→(
}=≤≥.D→\[mT≥~→${{<
≥→<KD∧∩9H
≡λ→→,m;Y<d∞{{9$
⎇~→.$≤≤[n<]≡%D~=λ
≡h≥≤L\=→9↓QX<h∀≤X;LM{(→M}[+C!!"Hλ∧λ(≤X-l≠{(m|[(
≡hλ_-o=~~-lh≤Y,≤λ→\M⎇(≥~T~;\∞↑λλ→M≥→(≥
=λ~.4≠[⎇∧∧_(→N]X⎇~-⎇C"Y\Z;Z.M;{H
}Hλ_$→8{≡Y+H∧∧∩=λ
≡hλ≤m≥<≠≡${|~,\λλ~-n≠h≥
(λ≠n↑≤≥=∧Z;→$∧≠yH∞M→#"L={<~-L<H~-d≤⎇8m∧_(≥l∨(≥~≡λ≥z]H≥~≡λ→Z-L(~<d
≠x9\λ~=∧∞z;≠∧Y(→.l;≥8.L9C!!"Hλ∧λ(→→,=_<Y$∧~<h∀λ→[n-(≥z
}y(_l≡Hλ~.4≥~→$∧_=≠mT→→8mL<Y+D∧∀y9!∀→[|D
≠⎇h∧
=λ~.1"\≤M|y<|l\λ_↑$∞~→(={<~-L<KH∧	=α:.4~9{M}Y9λ/(≥~T~;]↑\≤Y.L<H_L\x=<lTλ≥~↑Y(~.1"X;D\⎇8N$_x;
L9λ→\{_<LT~;H	\8{~.>λ≥z
≤zλ→
|<h≠M}~~;LuC"C!$λλ∪M}→(≥
=λ~,d_(→M}[(~.4≤Y8,D→\[mT≥~→$
;\≥.D→Z;T_;Y∧
=≤h<<H~≡h_Y,]H→→,m;Y9↓QX<h∀≠88n-kλ≥
(_{m↑~;→.$≥z;
D_<≤
O(≥~T≠88n-h_;LD≥~→-d≤≤[l<<|h∞M→(≤L↑⎇;≥∧<h~,a"Z=∧
_9λ,9;H∧∞Y89∧\[{$∞~→(
≥\≥=∧∧→Z;UHλ∃
∞<h~,d→[{d∧~<h∀≠88n-hλ≥m
8zλ←≤_;LNc"Jm{h_!≤H_j$∧~;]
t
→→,n;Hλ∀KKE∃λλ≥
(≤Y.>;≥~-lhλ→N]X⎇~-⎇H→→,m;Z=
≥{B=m≥≠λ_LQ"X{m↑~;→,EC"C!!"C"AQC"C!!"C"AQC"C!)x⎇≠l,<HED.-g⊃""(∧∧λ∧m¬V+Mα!⊃"4_,|(
&q"@↓A""(∧∧∪88mM<|λ
,9Y<L]Xy(	\;]8-A"C"AQL+M$∧∪⎇=∞∞=λ≠ld≥~→$λ{{<
≥→<C!!"C"D∧λ∃~T≠⎇=∞∞=λ≠ld≥~→${{<
≥→<H∧
[|[,≥≠≡(={\z.>≤h≠ld→<\M}H_;LDλ≥x.-Z;Yd
9<|l≤y<c!-{H≥
(≥→.-:;X-Eλλ_-lλ_(m;→(
|Hλ≠,≤z~;LT_{yT≥z~,=λ_x-dλ_Y$
≠x9\λ~;NMhλ_$
~<|↓QY;]M≡[{[,]]λ≥m≡~λλ
Mx9λ
}Hλ→L≡{≠x,EHλ∩-dλ≥~T≤→≤¬V,λλ
≥<≠→-\;]_.M;{H
≡α:<d;≤{aQ\≠|n=8[→$∞≠h→l↑λλ_$∧[_<∧Z;→%dB5~
≡h~<d(→Z-L"=z
≤zλ_m⎇]_:-nh≠8,=~;Y!≤{y→$
;C"N?;8[mM8h→M}[+C!!"Hλ∧	;Hλ∞M→(λ	↑;≥~,>hλ~-↑≠→;,]]_=
≥{H≥
(λ_m⎇<~;↑Hλ≤∞-y≥8l↑hλ_!≡⎇_;LL<Yλ
|ZY8nA"\y,⎇9;]∧∞z=~∧"=≤L≥\{_.M|H≠L≥9(≠ldλ[~.>λHλ≥Yλ_$∞};8M⎇λ≤y,>~;{D∧≥z~,=λ_{mn_:;N1"]~T~;YM}[8=
≥{H≥.<9λλ/(≠≠l≤λ≥≠d→9Z-l(λ→N]X⎇~-⎇\kλ∞<=λ≥.∧_{{N>_;]∞4λ≠Y,\→9λ/#"]
(_{m↑~;→,D_{yUλ_|L\=→(∧.=;h
M;Z|d%λ→=5C"C!$λλ∃m;Hλ∞M→(λ
|ZY8nDλ≤y,⎇9;]∧
<hλ∧-≠x9\λKλ∧
=λλ
≡h≠[nDλ_{n
99λ∧
;]≠d∧≥~→$
~<|↓QY;]M≡[{[,]]H∧∧∩;\nL89λ∀λλ[
≥Zx9lTλ_[
|zhH
≡hλ≤l↑λλ≥.∧~;H∧∞~→",]]Z<M⎇[9;ND_;Y↓QZ;Z.M8;~/,9λλ≤x{|LM;Yh∞Mhλ→
≡Y8⎇
≡Y<h
≥Hλ≥
(≤y,⎇9;]∧}hλ≤o≥8[{∧∧≤y8nM;{KD∧∃~~.1"X[
|zh~-l{≥9↑h≥~T≤Y9L↑Y;XlTλ≠X-\(≠yD∞~→(
|ZY8nDλ≤y,⎇9;]∧;Yλ∀≤≠z-n→<H∧∞≠h~.EC"U
∞<hλ={<~-L9α8m|→(~.4λ_=.M{8=
≤x;≠∂⊃<z_.,9λ_L↑≥y9-a;=;∞M<≠→$∧≥<y..hλ~-d≥~→!QS=;∞M8|h
≥<≠→-\;]_.M;{KD∧∩≠⎇l↑Y<K∧
~<⎇∧∞⎇≤],>≥<Y${{\nL;]≤d∞<y9∧↑(≥
(_{m↑~;→,A"X{lL(_x-d≠Y=L↑H_Y$∞z_<L\C"AQHλλ	≥H≥~T≤→≤¬V,λλ
≥<≠→-\;]_.M;{H∞M→(≠n↑≤≥=∧
yB=
(_{m↑~;→.$~<h∀λλYL≡{λ→M≥→+HAQU~~.4→Z;T_Y9m≥\hλ∞⎇=~λ∀~→8,L<Hλ
≤→;]
≤↑:;Lt~=λ≡hλ_$X<{∧Z;→$∧_;Y∧
;Y~,<=~;Lq"]z≡λλ≥L↑\z;mdλ≠yD∧≠~<n∧λ~=∧∧≥x<d∧≤≤[lN8y9∧∧→[|Edλλ

M~<h∧
<hλ∞↑y9λ∧∧≥≠h∧→=→,>β"Z-l{{<≡~8Z-M=~9.5J(λ
M→(≤L↑⎇λ≠ld≥~→$Z;→${{\m≡⎇≤h
|H_(∞<<Z9.4≠yHM<Y8nM=Y<d∞≠c"MMx9λ≥Yλ≤L]≠xx.L(_{lL(≥{n,≤kλ∞<=λ≥.∧≠~<nE<⎇≤N\⎇≥<LT_{{N>_;]∞5α<Y,l<Y;L<(≥X-N9#"L<;≠≤d
yH≤o≥8[{∞5λ→=L≥≥8=T≤X;LM{(∀e\>≤≤L↑|z;mnkλ→.LkC"AQHλλl<{≠l≤λ≠|↑X=→.4_↑(∞,89~-lh≥~∞-⎇9z∧∞~→(m;→+∧∞⎇≠|M≥Yh_m|→(~-dλ≠~.>	|h-;X<O⊃"\≤M||X;$∞|_8lUλ_;LD→y;L↑X=~-lh≥~T≠Y8l↑|x<O∀∪∩4j∧≠xZL\⎇≤hm|H_m⎇\⎇_-n≤b=.<9λ_O⊃"]~T_{{.
;→9∧{y→%dλ∪[n-8;≠∂∀≠[{LT≠yH∞M~<h
≡h≤z≡Y9λ,=≥y,]H≥<l↑\kλ.=λ≤l\(≤_,|#"LeVMh→M}H~;Lm|[8.M;{H
⎇H~≠nt≥≠h
\:y(
≡λ≤≥.,(_;LD≤z_.,9C!!"Hλ∧
~→<LT~<h∀→];L>~;{D→9Z-l9λ~-dλ≥~T_{{.
;→<ED_{⎇.N≥=∧∞z~8m∧_x;DY"=.<9λ≥
q"\≥.D_(≤L≥Y≠{$
k9>∞∞Y<|m≥{H~-n≠h≥
(≠⎇.N≥=λm;→+D∧∃z→-d≥~→$Z;→$
<hλ
Mx9→,Eλ≥~
≡c"Te\>≤≤L↑|z;md≥z;
D_Y(↑X;≥,≡→9D∧∃~~.4λ_x-d_Y(∞↑y9λ∞Mh≤≤M≥]λ∃
(λ≥L↑\z;md≠];,,<C"M|H≥~Q<≤[l}X;+∧
;Z=
≤;~>LTλ~=∞4→_=∀λ_X.<+λ→.LkHλ∧	=λ_l≥[[⎇∧∧_Y(∞↑y9α.Mh→[m⎇β"X.-⎇;Y∧∞z=~∧
xX<N,><h,8x=.<(≠yD∞~→(∞|>(≥
(≠≠l≤→<H
;Y≠↑h_=
⎇:8h∞?;8[mNnHλλm|C"L\YZ8m≤;X}%D~=λ.:;→∞4_(≥≤[→(
|H_;
D≥~→$=≠{.4≠Y9,L9λ_O∀≥~→$Z;→$Y:;Lt≠≠x,L9β!,;Yλ>Y8=↑h_;LDλ~;NL<[\d∞~→;$;≠λ
.<⎇α-⎇Xy+D∧∃~~.4≠8:l↑h≠≠l≤~;Yd∧≠=8m∧→X<nL<Kβ!,]=λ
\8;\d∞~_=∧=Y4O≡~~;Lt~;H
⎇Y(→M≥→(~≡h≥≠d{h≠md≥~→$∞x;9$
xX<N,>+C!!"C"J9y(εE.α"!∀λλλα6,+FQ""(	|⎇≠xL↑HK∧ε.-n!Q@↓A C"D∧λ∃~T_{⎇.N≥=λn;X⎇
≥{Hλ∞↑⎇8;
O(→≠l↑h≠[nD~_=LQ=≠h,(≥<l\λ≤m≥Xy(∧∞~→(={<~-L<C"L=⎇=≤∞↑≤hλ≥↑(→M}[(λ
≡λ≤Y,≤≤hλn[{(∞M→":-n≥=λM;→(∧∞~_=∧≠y<d∧≠[⎇∧
≠{zd∧≠~:lT_#"LL8{_.,=~;mdλ≠|D(λ→N]X⎇~-⎇Hλ→\Z;Z.M;{KD∧∩=λ∧
<hλ∞∞[⎇Z,L9λ→M}B=~Tλ_Y-l9Z5∧
yC"L<<U_-≥H~_-≡↑(∪,≤|[|ea C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!!"C"AQC"C!! C"AQC"C!!"C"AQC"C!! SxnMxY<DεKλ'⊗n""!∀λλλα6,+FQ"""*9y(εE.#"@			   Maclisp Reference Manual


1.6  Functions Connected with the Compiler


declare		    FSUBR

     In  the  interpreter,  declare  is like  comment.	 In  the  compiler, the
     arguments	are  evaluated	at   compile  time.   This  is	used   to  make
     declarations, to  gobble up input	needed only in	the interpreter,  or to
     print messages at compile time.  Examples:

	(declare (special x y) (*fexpr f00))

	(declare (read)) ;in compiler, gobble next S-expression.
	(something-needed-only-in-the-interpreter)

	(declare ((lambda (↑w) (princ "Now compiling fubar"))
		  nil))


%include	    FSUBR

     (%include name) is used to cause  an "include file" to be included  in the
     input to  the compiler.   It works  in the  interpreter also,  causing the
     specified file to be inpush'ed.  name may be a string or an atomic symbol.
     The translator search rules are used.

     Note:  this function presently exists only in the Multics implementation.


     See also the nouuo switch, part 3.5.














Page 4-10			    ∪4-1.6			 October 2, 1979
				 Declarations




2.  Declarations


   It is  often necessary  to supply information  to the  compiler in  order to
compile a function beyond the  definition of the function with defun,  which is
all  that the  interpreter  needs in  order  to interpret  the	function.  This
information can be supplied through declares.

   A  declare is  a list  whose first  element is  the atom  declare  and whose
remaining elements  are forms called  "declarations." The compiler  processes a
declare by evaluating each of  the declarations, at compile time.   Usually the
declarations  call  on one  of	the declaration  functions  which  the compiler
provides.   These  are	described  below.  However,  it  is  permissible  for a
declaration to be any evaluable  form, and it is permissible for  a declaration
to read from the  input file by using the  read function.  This may be	used to
prevent the compiler from seeing  certain portions of the input which  are only
needed when  a program is  run interpretively.	Prefixing  a form in  the input
file with  (declare (eval (read)))  would cause it  to be evaluated  at compile
time if the file was compiled  or at read-in time if the file  was interpreted.
Arbitrarily complex compile-time processing may be achieved by	the combination
of declarations and macros.

   The remainder of this  section describes the declaration  functions provided
by the compiler.  Note that if a declaration function described below is of the
form (foo t), its effect can be reversed by using the form (foo nil).

(specIal var1 var2 ... )
     Declares var1, var2, etc. to be special variables.
¬
(unspecial var1 var2 ... )
     Declares var1, var2, etc. to be local variables.
¬
(*expr fcn1 fcn2 ... )
     Declares that fcn1, fcn2, etc. are expr- or subr-type functions  that will
     be  called.  This	declaration  is generally  supplied by	default  by the
     compiler but  in some peculiar  circumstances it is  required to  tell the
     compiler what is going on when the same symbol is used as both  a function
     and a  variable.  It  is good practice  to put  *expr, *lexpr,  and *fexpr
     declarations for all the functions defined in a file near the beginning of
     that file.


October 2, 1979			     ∪4-2.			       Page 4-11
			   Maclisp Reference Manual


(*lexpr fcn1 fcn2 ... )
     Declares fcn1, fcn2, etc. to  be lexpr- or lsubr-type functions  that will
     be called.  This declaration is required for non-builtin  functions unless
     the  functions  are  defined  in  the  file  being  compiled  and	are not
     referenced by any functions that are defined before they are.

(*fexpr fcn1 fcn2 ... )
     Declares fcn1, fcn2, etc. to  be fexpr- or fsubr-type fUnctions  that will
     be cAlled.  This declaration iq required for non-builtin  functions unless
     the  functions  are  defined  in  the  file  being  compiled  and	are not
     referencEd by any functions that are defineD before they are.

("*array arr1 arr2 ,.. )
     Declares arr⊃, arr2, eTc. to be arrays that will be referred to.	See the
     note ufder *expr.

α(fixjumvar1 var2 ,.. )
     Declares var⊃,  var2, etc&  th∞AE∀∪mCe%CEYKLAoQ←MJ@Am¬Y`↔↔~β←'MDαε∞L|↔O~,PhR∧∧ααεm∪εw.↑5`hPβ"Jm>≠]-Tλ∧3 #n type1 type2 ... ) ,.. )
     Declares fcntk be a fUnction which always petuRns a dixnum  result.  Also
     the  types od∧@Ai!JAC⊗;W7↔w#E↓βneβ*↓β∪↔≤cπK↔"βπL''KC∃EbβSgC+⊃1↓β-#
9↓∧84)α↓↓↓β∂∪↔W7.sQ↓β'KC∃βne↓β⊗)↓β≠MC;W5bβ7.≥m⊗v:∧∞FF*∧↔⊗?]\Vw"
↑W∨"∧&*α⊂ε&O
nVj`Q$ααα∧ff}n]Rbε\\⊗vNlpλ∧∞~→(≡Y⎇;,]]λλ
↑<⎇λ,(λ_$[≠{N]+α;n⊂77j≡x2V⊂λ6rpw~w3P:~2FE⊂λ⊂⊂⊂0\3zvr[:⊂6p↑P12P≠s⊂0w≡P:<x→WεEεB⊂⊂⊂⊂λ*42Pλ:;wPλ:<x2\P7s⊂λ34|7≥vP⊂2→qv0y_z4ww≤P6p|H⊂12Pλ4w:2\6t|2Y⊗⊂⊂3≠y⊂2|_vx62CE⊂⊂⊂λ⊂∀34↑7:vP≡⊂∀3_⊂34|≠:vTP≡TWεEβE∀36≠w:vP≥0y_P≥0y→⊂↔↔⊂∀→1w⊂:≡x2XP↔↔⊂∀H↔↔↔⊂
FE⊂⊂λ⊂⊂$yH:42P≤pvrPλ0yP:~2P34↑7:vP→2qv0\0z4w[⊂⊂2|_rx:⊂≥42P;_y4pq≠2yP⊂≠y⊂3:[1z4w[⊗FE⊂λ⊂⊂⊂9→yzv:≤P0y2H22qv_y2r⊂≥7P0v≥p|yP_2P36≠w:vyKεEεE
77z<\2P;0\_P;0\→⊂↔↔⊂∀31[⊂:<x→XP↔↔⊂∀P↔↔⊂∀FB⊂⊂⊂⊂λ$yP:~2P9p[rP⊂0\P:42H34|7≥vP22Xv0y0]4ww⊂λ2|1r\:⊂:4→P;0y~pq62\P⊂7yλ3:w1]4ww⊗CE⊂⊂⊂λ⊂92y]v:9P_y2P2→qv0y→r⊂77]⊂:7P_2P7sλ0w<P≤x2qtY4qP:≡x2WεBεE∀3~|9{P≥∀FE⊂λ⊂⊂⊂!XzyryH⊂:42H1wvx~v2y⊂λ:7P0\yzvrH⊂:40]⊂0v6αpy4z~6rz4XP4yPλ:7P1→P⊂27[2P;t]4εE⊂λ⊂⊂⊂3~|7:v\P2|1[:yt{→v<V⊂→|1rx≥⊂⊂:4_z⊂7q≥4wzy[<P3:[1z4w[9P⊂9]qt⊂0\P∃R∧Xw2⊂1[yFE⊂λ⊂⊂⊂;Zv6⊂9]4v6⊂≥yrP3≠7w:v\WεEεBεE(0YrP~⊗LY∧DDH⊂⊂⊂⊂∧Z⊗Y↔αDDP'Xz7q2\⊂→⊗⊂\[\FB				 Declarations


(fixsw nil)
     Turns off the above.

(flosw t)
     Causes  the compiler  to assume  that all	arithmetic is  to be  done with
     flonums exclusively,  except that	obviously functions such  as +	and rot
     will still use fixnums.

(flosw nil)
     Turns off the above.

     fixsw  and  flosw	are  variables	so  (setq  fixsw  t)  is  an equivalent
     declaration to (fixsw t).

(setq special t)
     Causes all variableq to be special.

(setq nfunvars t)
     CauseS  the compiler  to disallow	functional varaables.	All  symbols in
     function position in afkrm  are assumed to hav@∀ABAMU]GiS=]CX@↓ae←a∃airA¬h~∧@@@AeU\@Ai%[J\@↓)QJ@↓GCgJ↓←L@A∧Ags[	←X@A]Q←gJ↓mCYk∀@ASf↓B@AMU]GiS=]CX∪→←eZA%f~∀@@@AI%gCYY=oKH\4∀~∀Q5CGe←LAhR~(@@@@↓πCkg∃fA[C
e↑AI∃MS]SQS←]f↓iVAE∀AeKi¬S]KH↓ChAeU\AiS5J\~∀4∀Q[C
e←fA9SXR~(@@@@↓πCkg∃bA[C
a←f@↓iVAE∀AIKMαK;↔⊃αβ?;3JβπQβ≤{7C'd)↓βSNk∃9↓¬##'MεKE↓β&C∃β∪.3πW3 h)↓↓α↓β∂π≤∧Rph!Q"F>]nπ⊗.m∨αε6⎇u⊂hR∧∧αα∧<≡W≡/4↔/F≥M⊗∂↔∀∧ε7.l:FN}n4ε>∞lZ&∂&\@ε↔J∧
FF*8m↑~;→.∧
→Sn∧λ~;N>_;XlT≥z→-a"Hλ∧∧λ→]-l⎇~;md~<h∞↑y9
$∞≠h_LT≠X;,\λλ→M⎇{Kλ∞⎇→<Y$
H~<d(≠]-\Y<H
≥X|Y-\;]→,Dλ_↑$ε#"H∧∧λλ→,≤zλ≥
≥9(≤n\zλ_$];XnM;{H
≡h→y-l<X=\Hλ
M→(→l]\≤Y,m>λ→\{_<L≡~;{D
<h≥.<9β"D∧λλλ∞⎇→;H∞<=Y<L≥λ≤y.<X=]≡(⊂m⎇<~;\λ→Z-L<h_.,(≥≠dY(≠
|9→9∧∞≠yy.M→<K∧
;H≠n,→<C!$λλλ∧∞≠h_.mz9λ
l;9(=_<r↑kHλλ⊃<Y8.={X8ML(_{mnY;]
≥{H≥m};→λ,(≥≠d∞<y(∧∞~→(
l;9#!$λλλ∧
yHλ∀λ→Z-L(_<d∧≥~→$∧→y;N∞Y9Z/∧≥z=

;Hλ∞M_=λ∧Z;→%dλ∩9D∧≡;⎇$∧→≠{D}λλ→m≡Y(_!QHλλ∧∧→y;N∞Y9Z/∧→→8mL<X=
≥{Kλ∞M→(_m⎇<~;↑H≥<l↑hλ9d
|H≤m⎇9=~
≥Yh≠
≥y(≥
=C!!"C"AQC"C!!"SxnMxY<DεKλ'⊗n""!∀λλλ∧αm,Ea""(∧∧λλλ∧
_9y$ε,,aQ@↓A""(∧∧∪88mM<|λ
,9Y<L]Xy(	\;]8-A"C"AQJ_<N,>*H¬∞≤<→$<\L$
L(_..LH≠F$KKD¬(KEd
#"D∧λλλ	≡h≥<l\λ≥≠d→8s≡Y(_..X><d<\L%D_<\F%λ→=5Hλ≥∂≡→(≠,∨(_Y$Z>≠N]+λ→MM{];%D≠|C!$λλλ∧
[⎇≡..h~.D~;Y
≤x=→.4≥z_.D≥≡4T≠yH
|ZY8nNh≥z-Mλ_Y${{]≥;Y9∧
;H≥
(_<N,><kAQHλλ∧∧≠L+∧∧≠LK∧∧→=_edλ_<LTλ≥~Q;];,,<B;ldλ→~-\;\z-⎇\b2-dλ_<Nε+λλ∧<\DEDλ→=5C"H∧∧λλ≤L↑|→8nM=Y;∂∃Hλ∃
(λ→/∞→;Y\λ→[n-"*_..X>*D¬≥≡<Tλ
_..L(→
≥,+L$∧→~;&∃LHEeC"H∧∧λλ→
≥,+[E∀	KKE∃(_p-d_Y(∞↑y9D∧∩=λ
≡h≤≤L\Y<\L\λ~9D∞~→(M;9;N=9{\d<Y(
=[⎇{D=β"D∧λλλ={<~-L+=~-\+Hλ
M→(→
≥9;\m≥{\hL8{_.,9λ≠.↑⎇λ_LT→:=
<H⊃M∨≠];.4≠|H
m;λ∪n∧∂kβ!$λλλ∧∞z~8m∧~;Y
≤x=→$(→~-\;\z-⎇H≠[nDλ~{M}{H_.D_{p⊗\4v2P≥4vrWλ⊂$s⊂λ24vr[9tww≤P0y2CE⊂⊂⊂λ⊂22q[0y2r⊂:42H1wvx~v2y⊂_pw⊂3Yw2y0]2P3 \z2y⊂_wr2WβEαE⊂λ⊂⊂⊂*~2P0y≤0|U⊂→2qv0\0z4w[⊂⊂1p]yryP≥42P1[vx4f→y⊂⊂:≠P3rw→y0z2H4w⊗v~w2P⊂_wr2P→7yεEλ⊂⊂⊂⊂_qqri\rqP'Y⊂0w2λ9z7y→SyP4[:7P⊂≥42P0\90|yH22qv_y2r↔λ⊂*44\P1wr→P⊂4iH9wvr]t0rεB⊂⊂⊂⊂λ30yz→y⊂:4_w⊂:4→P:yzXv⊂9zX97zz~w2VqXv6⊂0\90|P_qqri\ts3Gλ⊂*42H⊂1wf\4v2yλ;tv6βE⊂⊂⊂λ⊂0v9[P3rw→y0z2H4w⊗v~w2P1[r2P4Yα the arbaycalL function is used; in this case
     the  array must  be named	by an  arBay)poInter pathep  than by  an atomic
     symbol.
¬
(arath (tyPe1 fCn1 fCn2 ...) (type2fcn21 fcn22 ... ) ... )
     Is  used to  declare a  general  arithmetic function  such as  plus  to be
     replaced by a one-type arithmetic function such  as +.  fcn1,  fcn2, etc.
     are the funcTions tk be replaced.	type1, etc. is the type of  function to
     replace  them  with:  fixnum means  replace  them	with  the corresponding
     fixnum-only functions, e.g. replAce plus by +.  flonum means  replace them
     with the  corresponding flonum-only  functions, e.g.  replace plus  by +$.
     notype means turn off a previous arith declaration for these functions.


   The following  declarations are  useful only  in the  pdp-10 implementation;
however, the Multics implementation will accept them and ignore those which are
irrelevant.

(mapex t)
     In the pdp-10  implementation, causes all	map-type functions to  be open-
     coded as do loops.  (This	is always done in the  Multics implementation.)
     The resulting code  is somewhat larger  than otherwise, but  also somewhat
     faster.

(mapex nil)
     Causes map-type functions to actually be called.  This is the default.





Page 4-14			     ∪4-2.			 October 2, 1979
				 Declarations


(noargs t)
     Causes  the  compiler  not  to output  information  as  to  the  number of
     arguments	each  function compiled  takes;  this provides	some  saving of
     memory space in non-Bibop pdp-10 implementations.

(noargs nil)
     Causes the compiler  to output number  of arguments information.	This is
     the default.

(messioc chars)
     Causes  an (ioc  chars) to  be done  just before  printing out  each error
     message.	In this  way one  may  direct error  messages to  the  LAP file
     instead of to the terminal on the pdp-10.

     The default messioc is vr which puts the messages in both places.

(muzzled t)
     Prevents the pdp-10 fast-arithmetic  compiler from printing out  a message
     every time closed compilation of arithmetic is forced.

(muzzled nil)
     Causes the compiler to print a message when closed-compilation  is forced.
     This is the default.

(symbols t)
     Causes the  compiler to output  LAP directives so	that the  LAP assembler
     will attempt to pass assembly symbols to DDT for debugging purposes.

(symbols nil)
     Does not generate debugging symbols.  This is the default.

(closed t)
     Causes arithmetic operations to be close-compiled, that is, the function +
     will  generate  in-line  code  but  the  function	plus  will  not  in any
     circumstances.  This  declaration is  necessary if you  apply plus  to two
     fixnums and want A bignum result if the operation overflows.

(closed nil)
     Causes the compiler to produce code that assumes overflow wilh  not occur,
     which may give incoprectlts in the above case.  When the compiler can
     determine, by declaration or implication,	that all of the operands  to an
     arithmetic function are fixnums (or flonums), it will generate code to use
     the hardware fixnum (or flonum) instructions.  This is the default state.

October 2, 1979			     ∪4-2.			       Page 4-15
			   Maclisp Reference Manual


   This declaration only exists in the Multics implementation.

(defpl1 ...)
     Defines an interfacing function which may be used to call programs written
     in other languages, such as PL/I.	See part 4.6 for details.







































Page 4-16			     ∪4-2.			 October 2, 1979
			  Running Compiled Functions




3.  Running Compiled Functions


   After a file od functions  has been coMpiled, those functions can  be loaded
into an environment @¬]HAi!K\AkMKH\@↓)QKr↓GC\A	JAY←¬IKHA∃SiQKHAErAUgSMN↓iQJA1←CH~)←d@A→CgY←¬H@AMU]GiS=]f∪I∃gGeS	KH@A	KY←n0@A←dAEr@↓kgS]≤@AiQ∀@ACkQ←Y←C⊂AMKCQkeJ~)IKgGISEKH↓←\Aa¬OJ@f4dl\~(~∀~∃QQJ@A→←YY←]S]N∪→k]Gi%←\@@↓Sf@A¬h@AaIKgK]P@@ACYCSYC	YJ∪←9Yr@A%\@@AQQJ∪≠UYiSGL~∃S[AYK[K9iCiS=\\~∀4∀~∃Y=CH∩∩@@A'U¬$@b↓CeN~(~∀@@@@QY=CHAp$X∪oQ∃eJApASfA∧AMSY∀@Aga∃GSMS
CiS←8ACGG∃aiCE1J@AEdA←aK9RX@A$]J\A∧~∀@@@A]C5Kgie%]NA←HABA]¬[KYSMhXAG¬kgKf↓iQJAMaKGS→SKHA→SYJAQ↑AEJ↓Y←CI∃H@AS9i↑Ai!J~∀@@@AK9mSe←9[K]h8@A)Q∀∪MSY∀A[CrAEJA∃SiQKHAB@AM←keG∀AMSY∀@A←d↓B@AG=[aSY∃HAMS1J~∀@@@@Q
CYYK⊂AB@E→CgXD↓MSYJ↓S\@AQQJA∪Q&AS[AYK[K9iCiS=\AC]⊂AC\A=EUKGP@AgK≥[K]h↓S\~∀@@@AQQJA≠UYiSGLAS[a1K[K]QCiS←8\RAY=CHAI∃iKe[%]KfA]QSGP↓isaJ↓←LAM%YJASP@ASf↓C]H~(@@@@↓CGif↓CGG←IIS]O1r\∪α↓g←ke
JAMS1JASf↓Y←CI∃HAEr↓←aK]$OS]N↓C]HA%]akg OS]N↓Sh\~(@@@@↓αAeK¬H[Km¬XAY←=`ASfAiQK8AKqK
kiKH↓k]iS0AiQJAK]H↓←LAi!JAMS1J@ASLAeKC
QKH\4∀@@@Aβ\A=EUKGPAMSY∀ASfA1←CIK⊂AErAIKCIS9NASh0AIKM%]S]N↓Mk]GQS←]f↓Cf@A⊃SeKGQKHAEd~∀@@@Aga∃GSMS
CiS←9fAS]MKeiK⊂AS\AQQJAM%YJAEdAiQJ↓G←[a%YKd\4∀~∀~)MCgY=CH∩∩@@A
M+¬$~(~∀@@@AMCMY←CH↓iCWKLAiQJ↓gC[J↓CeOk5K]ifACfAUeKCH8@A∪h↓GCkg∃fABA→SYJ@↓←LAG=[aSY∃H~∀@@@AMU]GiS=]fXA
CYYK⊂AB@E→CgXD↓MSYJ↓S\Ag=[JAS5aYK[∃]iCi%←]fX↓i↑AE∀@AY←¬IKHA%\\~∀@@@A∃qC[a1Jt~∀4∀∩∩∩QMCg1←CHA→←↑AM¬gXAIMVA[C
gsZR4∀~∀~))QJA→←YY←]S]NA→k]Gi%←\A←9YrAKaSgif↓S\Ai!JA≠k1iSGf↓S[aY∃[K]i¬iS←\8~∀~∀4∀~∀~(~∀~∃=Gi←E∃d@dXbrnr$∩∩@@@@&h4f\∩∩$@@@@@A!C≥J@hZDn~∀_∩∩∩@A≠C
YSg`↓%KMKIK]GJ↓≠C]k¬X~∀~(~∃IK→gkEd$∩@@@↓→'+¬H@fAi<@nACIOf~∀4∀@@@AIKMMkEdA%f@Ai!JAMk9GiS←8AkgK⊂@Ai↑↓IKMS9JA]K\@A[C
QS]J↓G←IJAMk]
iS←]L\@A∪P~∀@@@AIK→S]Kf↓mCeS=kfAieaKfA=L@AMU]GiS=]fXA⊃KaK]⊃S]NA=\ASiLACeOU[K]iL\∪)Q∀AoCr4∀@@@Ai↑A⊃KMS]∀ABAgUEdAoISiiK8AS\AA_←∩A%f~∀~(∩∩@@@@QI∃MgkEH@EgK≥]C[Jλ@EK]Qes]C5JDA]¬eOfR4∀~∀@@@Ao!SGPA⊃KMS]∃fAgK≥]C[J⊃K]iee]C[J↓CfAB↓gkEd↓KqaK
iS]N↓]CeOL∪CeOU[K]iL\@A)!J~∀@@@Am¬YkJ@↓eKikI]KH@↓SfABAa←S9iKd@↓oQSG @AGC8AEJ@↓akiaI←`OK⊂∪k]I∃d@Ai!JAgk	d~∀@@@AaI←aKeQrA←dAiQJ↓MgkEHAae←AKeir8∪)QJ↓oCrAQ↑@AI∃MS]J↓C\AYMkEd@↓oeSiQK\AS8~∀@@@A!_=∩ASf4∀~∀∩@@@@!IKMgUEd@EMKO]C5JD@E∃]ies9C[JD↓]CeOLdTb`@`W]CIOfb@4dR~∀4∀@@@AoQS
PAIK→S]Kf↓gKO]¬[JIK9ies]¬[JACLAC\A1gkEd↓CYY←]S]NA→e←ZA9CeOfDAi↑A9CeOfH~∀@@@ACe≥k[K]Qf\@AQQJ@b@``@A%fA←GQCX\@↓)QJ@↓mCYk∀AeKiUe]KH↓gQ←k1H@AE∀AakiAe←`O∃H~∀@@@Ak9IKdAQQJAYMkEdAAe←aKIir\~(~∀∪aC[aY∃ft~∀$@@@@!akiaI←`@O5sgkEH@QIK→gkEdE[sMU]fD@	[sgk	dD@b$@Ogk	dR~∀$@@@@!akiaI←`@O5sMgk	d@QI∃MgkEH@E[s→k]fDE[sMMkEdD`R@O→gkEd$~∀∩@@@QaUiae←@@O[s1gkEd4∀∩∩Q⊃KMgk	d@E[eMk]fλ@E[s1gkEdλ@d``D@ZdROYgk	dR~∀4∀@@@AαAMU]GiS=\@AI∃MS]K⊂AS\@↓iQSf↓oCr@↓eKGK%mKfA%if@A¬eOk[∃]ifA¬]H@AIKike9fASiL~∀@@@AmC1kJA←8AiQJ↓[CeW∃HAaI0XAoQ%GPA[¬rAEJ↓CGGKMgKHAQQe←k≥PAiQ∀AKqi∃e]CX↓giCi%F~∀@@@Aa=S]iKH~∀~∀$∩∩@A1Sga?MiCiS
?mCeM>Igi¬GW?aQd~∀~(@@@@↓'KJ@↓aCehl\l@↓M←dA⊃KiCS1f@A←8AQ←nAi↑A¬GGKgL@AiQ∀ACeOU[K]iLX@AC9H@A←8AiQJ4∀@@@AS]i∃e]CX$AM←e5Ch@@A←L∩↓→∪' $AICi∧\∩@@↓YSga⎇giCi%G?mCIg>I]%X@@@↓C]H~(@@@@↓YSga⎇giCi%G?mCIg>Ii⎇Ci←Z↓CeJA→SqKHAES\ nbRA∃qiKe9CXAgQCiSFl@AiQ∃rAG←9iCS\4∀@@@A]SX↓C]HAP\~∀~(~∀~∀4∀~∀~(~∀~∀4∃!CO∀@hZb`∩∩∩@@@@&PZf\∩$∩A∨GQ←EKddX@bdnr~∀_∩∩∩@@@AIk]]S9NAiQ∀Aπ←[ASYKd4∀~∀~(~∀~∀P\@A%U]]S]≤AiQJ↓π←[a%YKd~(~∀∩∩$AS\AQQJA≠UYiSGLAS[a1K[K]QCiS←8~∀~∀@A)Q∀∪G←[ASYKd↓Sf@A%]m←W∃H@AEdAiQJAYSgA?G←[ASYKd↓G←[[¬]H@AQ↑@A≠UYiSGL\@A)!Sf~∃
←[[C9HAGC8AEJA¬EEeKYSCiK⊂AYG`8@A)Q∀ACeOU[K]iLAi↑AQQJAG=[[C]⊂ACeJAiQJ↓aCiQ9C[J~)←L@AQQJAS9akh@↓MSYJ↓C]H@↓←aiS=]f\@↓)QJ∪
←[aS1KdACAaK]IL@@D]1Sg`D↓i↑@AQQJAO%mK\~)aCiQ9C[JAU]YKgL@ASh↓Sf∪aIKGKI∃HAEr↓iQJ@[aCi!]C[J↓←d@@5a\A←AiS←\8@@A)!JA←kQakh~)←EUK
hAgK≥[K]h↓Sf@A
eKCi∃HAS\↓iQJ@↓o←eW%]NAI%eKGi=erAo%iP@A∧A]C[∀AoQS
P@ASLAiQJ4∃MSeMhAG←5a←]K9hA←L↓iQJA9C[JA=LAiQ∀AS]aUhAMS1J\∪
=dAKq¬[aYJ0AiQJ↓G←[[¬]H~∀4∀∩∩∩%YG`A⊃Sd⎇M=↑]ECH~∀~∃IKCIf↓iQJA→SYJ@	ISd⎇→←↑]E¬d]YSM`DAC9HAae=IkGKLAC\A=EUKGPAgKO5K]hA9C[KHEM←↑λAS\~)iQJA]←eWS9NAISIKGi←Ir\~∀4∀@@AUgkCY1rA]↑↓←aiS=]fA]∃KHAE∀AgkaAYSKH0AgS]
JAiQ∃eJACIJAIK→CkYiL\@@AQQJA←AiS←]L~∃Cm¬SYCE1JACe∀t~∀[ACiQ]¬[J@[A\@[`4∀@@@AπCkMKfAi!J@AM=YY←o%]NACIOk[K9hAi↑%EJAi¬WK\A¬f@Ai!JAKq¬GhAa¬iQ]C5J@A←_AiQJ4∀@@@AS]aUhAMS1JX@A∃mK\A%LAShAEKO%]fAo%iP@A∧A[S]UfAgS≥\\@@D]YSM`DAo%YX@A9←hAE∀~∀@@@ACaAK]IK⊂\~∀~-eval
     Causes the following argument to be evaluated by LISP.  For example,
		   lisp←compiler foo -eval "(special x y z)"

-time -times -tm
     As each function is  compiled, its name and  the time taken to  compile it
     will be typed out.

-total←time -total -tt

     At the end of the compilation, metering information will be typed out.

-nowarn -nw
     Suppresses the typing of  warning messages.  Error messages of  a severity
     greater than "warning" will still be typed.




October 2, 1979			     ∪4-4.			       Page 4-19
			   Maclisp Reference Manual


-macros -mc
     Equivalent to the (macros t) declaration:	Causes macro definitions  to be
     retained at run time.

-all←special
     Causes all variables to be made special.  Equivalent to the  (setq special
     t) declaration.

-genprefix -gnp -gp
     Takes  the  following  argument  as  the  prefix  for  names  of auxiliary
     functions	automatically generated  by  the compiler.   Equivalent  to the
     genprefix declaration.

-check -ck
     Causes only the first pass of  the compiler to be run.  The input	file is
     checked  for errors  but no  code is  generated and  no object  segment is
     produced.

-ioc
     If the following argument	is x, (ioc x)  is evaluated.  The main	use for
     this  "-ioc   d"  which  turns   on  garbage-collection   messages  during
     compilation.

-list -ls
     Causes a listing file to be created in the working directory, containing a
     copy of the source file  and a table of functions defined	and referenced.
     If the  object segment  is named "name",  the listing  file will  be named
     "name.list".

-long -lg
     Causes the listing file to also contain an assembly language listing, with
     commentary, of the generated code.

-no←compile -ncp
     Causes the compiler not to attempt to compile the file.  Instead the input
     file is simply treated as being composed entirely of random forms.   It is
     digested into a form which can be processed quickly by the load function.

		       in the ITS pdp-10 implementation

   The	ITS  compiler  is  presently in  an  anomalous	state.	 There	are two
versions, COMPLR and NCOMPLR.  NCOMPLR contains the  fast-arithmetic facilities


Page 4-20			     ∪4-4.			 October 2, 1979
			     Running the Compiler


described here.  COMPLR is an older  version which will soon go away.	At that
time, NCOMPLR  will be	renamed to  COIPLR.  This  documentation uses  the name
COMPLR to refer to what is now NCOMPLR, so it is presently inaccurate  but will
become accurate in the future.

   Invoke the compilep	with the :COMPLR  command.  The compiler  will announce
itself, print  an underscore  or backarrow,  and accept  a command  line, which
should be of the standard form
↓	    <output file> ← <input file> (switches)

The   file   specifications   should  be   stafdard   ITS   file   names,  e.g.
DEV:DIRNAM;FNAME1 FNAME2.  If it is  necessary to get a "funny"  character such
as ← into the file name, it may be quoted with a slash.

   The compiler normally processes a file of LISP functions and produces  a so-
called "LAP  file", containing	S-expressions denoting	pdp-10 machine-language
instructions, suitable for use with LAP (the Lisp Assembly  Program).  However,
one may direct the compiler instead  to produce a binary object file,  called a
"FASL  FILE",  suitable for  use  with	the fasload  function  or  the autoload
feature.  A third option is to process a previously generated file of  LAP code
to produce a FASL file.  This  is especially useful in the case  where special-
purpose functions have been hand-coded in LAP.

   If one specifies only an input  file name, say FOO BAR, then by  default the
name of a generated LAP file will be FOK LAP, and of a FASL file, FOO FASL.

   The	various  modes	of  operation of  the  compiler  may  be  controlled by
specifying various  switches, which are  single lEtters, inside  parentheses at
the end  of the  command line.	 A switch may  be turned  off by  preceding the
switch letter with a minus  sign.  Extraneous or invalid switches  are ignored.
Initially  all switcheS  are off  (the	use of	minus sign  described  above is
provided in case the compiler is used for several files in succession).

   The most commonly)used switch setting is "(FK)", which causes a FASL file to
be produced.

   Most  of the  switches correspond  to values  of atomic  symbols  within the
compiler.  These are noted in parentheses.

   The switches are:

A	(as@MK[EY∀R@A)!JAga∃GSMS∃HAS]AkhAM%YJ@A
←]iC%]fA→¬ AG←⊃JAoQ%GPASL@Ai↑↓EJ~∃5CIJA%]i↑A∧AES]¬erA
¬'_AM%YJ\~(~∃∨GQ←EKddX@bdnrα∩$@@@@&hZh8∩∩∩@@@@@↓!COJhZdb4∀_∩∩∩@AC
YSg`↓%KMKIK]GJ↓≠C]k¬X~∧~(~¬λ∪⊃Sg←o8\@@A
CkgKβ→βS#*↓β∂?oβ'3↔∩βS :∧FO≡}⎇bεON0	-LHλ⊂,n→<H
≡λλ~≡h≤⎇≡]→9↓Q\Y3Mm;Y`↔λ⊂*44\β is the sabest wai tk disown a COMPLR, because the  compilep will
know that it can't try to get any information from DDT.
F	(fasl)	Accept a file of  LISP functions, produce a LAP file,  and then
Assemble the LAP file into a FASL file.  This is probably the most useful mode.
With the K switch the LAP file is not actually produced at all; the lap code is
sent directly to faslap as the compiler generates it.
K	(nolap)  Kill LAP file.   Delete the LAP file after  assembly.	Usually
used in conjunction with the F switch.
Mo(in)(macros)	Equivalent to  (declare (macros t)).  Causes  macro definitions
to be defined at run time as well as at compile time.
N	(noargs)   No args  properties.   Equivalent to  (declare  (noargs t)).
Normally  the compiler	outputs information  in  the LAP  code as  to  how many
arguments each function requires, so that argperties may be created on the
appropriate  atomic  symbols  at  load	time.	In  some  implementations these
properties occupy a significant amount of list space; thus it may  be desirable
to eliminate these properties.
S	(special)   Equivalent	to  (declare  (setq  special  t)).   Causes all
variables to be considered special.
T	(ttynotes)  Causes the compiler to print a note on the	user's terminal
as each function is compiled or assembled.  This switch is normally off so that
a COMPLR  may be proceeded  and allowed to  run without the  TTY.  In  any case
error messages will be printed out on the terminal.
Uo(in)(unfaslcomments)	 Useful only  in conjunction  with the	F or  A switch.
Causes the assembler to output	comment messages into a file whose  second file
name is  UNFASL.  (Actuallq, this  file is always  created, and  error comments
will be directed into this file  also if messioc so specifies; but the	file is
immediately deleted if it contains nothing significant.) These comment messages
describe the size of each function assembled, and give other random information
also.
V	(nfunvarsf1		Equivalent   to  (declare   (nfunvars	t));  disallows
functional variables.
W	(muzzled)  (i.e.  Whisper).   Equivalent  to  (declare	 (muzzled  t)).
Prevents the fast-arithmetic compiler  from printing out a message  when closed
compilation of arithmetic is forced.
X	(mapex)   Equivalent  to  (declare  (iapex  t)).   Causes  all map-type
functions to be open-coded as do loops.  The resulting code is somewhat larger,
but also somewhat faster.
Z	(symbols)  Equivalent to (declare (symbols t)).  Causes the compiler to
output a  special directive  in the  LAP code  so that	the LAP  assembler will
attempt to pass assembly symbols  to DDT for debugging purposes.   Primarily of
use to machine language hackers.


Page 4-22			     ∪4-4.			 October 2, 1979
			     Running the Compiler


   COMPLR will accept a "Job Command Line" if desired; simply type

			  :COMPLR <command line><cr>

In this mode COMPLR will automatically proceed itself and run without  the TTY,
and kill itself when done.

   It may be  desirable to execute some  LISP functions in the	compiler before
actually compiling a file.  Typing  ctrl/G will cause the compiler  to announcE
itself and then  type an asterisk;  you will then be  at lisp's top  level.  To
make the  compiler accept  a command line,  say (maklap)  or type  ctrl/↑.  One
useful function for debugging and snooping around is cl; (cl foo)  will compile
the function foo, which should	be defined in the compiler's  lisp environment,
and print LAP code onto whatever device(s) are open for output.






























October 2, 1979			     ∪4-4.			       Page 4-23
			   Maclisp Reference Manual
α

¬














¬











	
















Page 4-24			     ∪4-4.			 October 2, 1979
			The Lisp Assembly Program, LAP




5.  The Lisp Assembly Program, LAP


   Maclisp  includes  a  facility by  which  machine-language  programs  can be
defined as  LISP functions.   This can	be used  to gain  direct access  to the
hardware or the operating system, and may also be used by the compiler.

   The Lisp Assembly Program translates S-expressions which resemble the native
assembly language of the host machine into machine language, and sets things up
so that machine language coding can be called by LISP programs in the  same way
that built-in "subrs" are called.

5.1  LAP on the pdp-10


   The	lisp compiler  for  the pdp-10	implementation does  not  output binary
object files directly;	rather, it outputs  a series of  S-expressions denoting
the  machine-language instructions  of the  compiled function.	 There	are two
programs which	accept such  S-expressions and convert	them to  binary machine
language, called lap and faslap.  (Historical note:  the word "lap"  dates back
to 7090 LISP, and is derived  from the phrase "Lisp Assembly Program".)  lap is
an in-core assembler; it reads	in the S-expressions (hereafter referred  to as
"lap  code")  and deposits  the  resulting binary  instructions  in  the binary
program space  of the  current lisp  environment.  faslap,  on the  other hand,
takes a  file of  lap code  and produces a  binary file  suitable for  use with
fasload.  faslap  is normally  part of the  pdp-10 lisp  compiler, but	in some
implementations  with  limited	memory	it can	be  a  separate  program.  Both
assemblers  will  accept  the  same  lap  code,  except  for  certain  peculiar
conditions.   This  section  will  describe  the  lap  function  and  lap code;
differences between lap and faslap will be treated in a special section.


5.1.1  The LAP Function


   lap is an fsubr which is executed primarily for its side effect - loading in
a binary program.  It  accepts a series of  S-expressions similar in form  to a
program  written in  MIDAS  or MACRO-10.   It is  not  intended to  be	a fancy
assembler: it does  not have conditional  assembly, macros, or	complex literal
generation features.  It  does, however, contain  sufficient power to  load the


October 2, 1979			     ∪4-5.			       Page 4-25
			   Maclisp Reference Manual


output of the compiler, plus enough extra features that simple machine-language
functions may be hand-coded in it.  (See the section on conventions for writing
lap code by  hand on part 6.6.	 The major operational differences  between lap
and MIDAS or MACRO-10 are that (1) lap is one-pass, while the others  take two,
(2) lap uses  the function read  to input lap code,  while the others  are more
efficient, and (3) lap assembles directly into the lisp environment,  while the
others produce a binary object file (note that faslap differs only in the first
two respects).

   The lap  function is an  fsubr which  expects to get  two atomic  symbols as
arguments; the	first is  the name  of the  function to  be assembled,	and the
secOnd is the  type (i.e. the property	under which it is  to be stored  on the
property list.) Thus

				(lap quux subr)

would assemble a subr called quux.  When invoked, lap repeatedly calls the read
function,  operating  on  the  S-expressions  thus  obtained,  until  a  nil is
encountered, at which time the assembly ends.  SoMe messages may be printed out
as this happens.  If the assembly completedsuccessfully, the variable bp@=eNASL~∃ka⊃CiKH↓iVAe∃MP∪↔≥!↓βSF)β;↔:βG'k*β?→↓ε∪';π↔IβCK};Kπ∃¬≠Cπ∂*aβπ≠ KS#∃εCCK␈βK'π&(4+C⊗{C↔K'Iβ'Mπβ3π∂.!β?9π##∃βπ∪?C↔↔#eβ3O≠Qβ?2βS#∃¬≠C↔∂N3'↔⊃∧S?7N→βOGn∪?18hP4	↓αα3/Kn33@∃Dεf∂∧F}/4
f␈"∞,W≡↓9→(
≥H≥~T~;Z.M8;λ
M<|λ∞∨<⎇→-Uα⊂:4≠zst≤42P4[4z4p[∧A1l\z2v@ dkes contain several speCiadize` f@U]GiS=]fAM=`	βW≤)βe∧¬F∂αβHλ	≥\⎇→,≤α∩⊂ ,ap
Has an autolh∂CHAae←AKeiR↓←D@Q1C`AM¬gX∪G=RRA↑αqα&R~βπ;⊃α↓##εαββπObβOgMJ↓β?9¬##∀∀T"⊗
T∩απ∨≤∧u]+B5
∞<kλ
≤H≠`↔→P9t`-plq@IKCIfASLA∧AMSY∀AP∨→∧cπAβ_¬v&*
@λ.∧λ≥z-Lα⊂6 /a`λ~∃¬ki←[¬iSGC1YbAβ9HACFπ≠↔7d)βS#*β↔∞l8

≥y\kAQ@εE⊂λ⊂ 2@2e ic an e@aC[aYα)↓β?2βG?7*β#π↓∧∧6}εT∧π>F≤9αε≡|.&/∨
yf'~∞-w.z≠⊗$∞≠hλ∞M→(≠
≡|β"LNαs1j~ww⊂6Yvx]εBE∧Pλ∀" Hλ#*g'⊗VfbfTP!ba∀∀FE∧λ⊂∀ i⊃iP#*S',VfQdhP∀∪$f⊂↔λ→∀TFB⊂⊂⊂⊂λ⊂&bfP cP⊂
%*fh⊃P!⊂&Qdbg"
DP∃y→yzv*λ70v⊂~s⊂0y→P→⊂'~vεE∧↓      (@LRX T 0 B)	 ;`YG∀AY←←,AChA
CdA←_ACeNd~∀∩@@@@Qπβ∪8A(@`↓αR~∀$@@@@@@Q∃I'(@`↓≠≠9λR%β[←'9εK⊃βO∞k∃βπ~βπK≥βλ4(%α↓↓↓↓αB"JJRα	↓A∧⊃$%↓↑+3O∃π#π/∃ε≠∪Iβ|∧bε∂,tβ⊂h!∀ααα∧∧αDU*:Bβα	XTl∀Xu⊂Jβ4⊗v"∞N'Jε≤|⊗NpQ$ααα∧∧∧l,XYd"α¬	T⎇4Y∀∧
β∧λ"HJπ>&/'↑-bε∂,tβ⊂h!∀ααα∧∧αE∧z	"¬α⊃⊃∩β↑←
↔"εn-vjεn]f∨&≥⎇`hP∀∧∧tLAQ hU≤v*βEV#0H⊃∀αα↓6ES*s∃f⊂HH∀	v∨&|,W∩β%DβKw⊃PP`H⊃~FF*	M↔∨αλ≡7≡.\-GJ¬∞-v?⊗≥UB∧d~↓PPh!Q"αα	mw&*∞Mε∂"∞MεO~
≡2ε?,\↔&g∀FN6l↑&.wA≥⊗rπ>O⊗f*n&}jεvβKα
L↔αb∞⎇εN≡∧∧π&}⎇4π&FQQ&.wM≡&*π∞-v?⊗≥Tε∂~
⎇f*ε≡,w.n]nBbε≥lBε
∞?⊗n⊗⎇Dπ&∞-LRε∂4∞FF*
}FF/%dαα¬MRε',≡v⊗∞=1PW>≡Mαπ&Tβ;β⊗∧εn/M
v"α
≡2π&≡Bπ&Tε.wM≡&*π∞-v?⊗≥Tαεo↑>Bε⊗T∞&.∞D
⊗rε,\f␈⊗T∧εO"
≡0hV≡>6.n-LV#Z∞MεO~<⊗rπ,↑↔.O,Tαππ-⎇εN⊗≡M↔6.O∀εf∂,|Rε∞]}Vw'4
v2α
\Vn␈/∃Bε/>V≡N≥MGHh,mw∩πMRεf≡∧ε␈/N∞W"εn-vjε=⎇WεNL≡FN}d
v"ε∀
F∂⊗|TεfO>∧ε7.l>FN}edα¬&Tαεn↑Mε}"∞↑6. Q,'JπNαk∧
F∂α
≡2εo\=αεn},Rπ⊗\≡6}v≤-F*ε≥dππ⊗≤>FN≡≥Dπ≡ON\↔&N⎇n2αFUlrrα∞,V∞&≥lrεNaQ&f∂∧6}&Tg⊗}T∩ε6≥LRJpQ!PRα∧
F∂αMv/~
mw"π↑<Rε∞d∩nf≡>Bε6}$εO'4∞7Nn-⎇Bπ&≤-F*b]↔&F↑%bα¬,≡FF/%Dαπ&Tπ6∞N\PhV|dπ&FQ≡7Nn-⎇BεO4∞7&␈,\Bαε⎇dπ&FT∧ππ⊗}W↔'∀
FO∨D∞Vv&↑$απ&Tπ∨NQ≡π⊗␈↑''Jd∧¬&G↑1PRFL\gπ⊗}∧πW&↑<6BβF4απ∨≥U∩π>}]F"ε\≥6*α∞Mε*π?≥V⊗}D∂'&/<=N↑m}vrπMtεf∂¬Dαπ>≡Mαπ&QPW6≥NV*βF5bαεL≡αεF≡4ε
α
nVn⊗↑$ε}2∞?⊗n⊗⎇N2εNm≡FN∞MO∩ε&\m⊗v.EDεNv=NV&Nltαπ&Tεv∞\↑0hV|dε∞fD∞FF*≤6∨.↑]F∂&}.2bε≥lBπ&Tε∞&N,W∨≡↑4ε}2∞=vn*∞↑6.7]Dπ⊗␈↑M⊗v/4∧εNwL↑&v∞D∞Fxh-M↔∨αa→↔"ε≥N6zα∞↑6/~∞Mε*αnVv∨M≥vrε|↑FnNL≡6␈≥⎇bε
∧∞7Nn-⎇BεNd∧π&FT∧π∨N\-vbε≡1PV␈MW↔>≡<Rαπ]lF.6≥lV"α∞Mrε&↑LW⊗n≥lRαπ⎇W&F↑$αεOD
↔~α∀απεN¬Sα∧
⊗w∨N.V∨&≥⎇bαGMPhV|↑FnNL≡6␈αnVv∨M≥vrα=vw&≥≥g~ε∀∧ε≡}l=↔≡*∞L⊗⊗fT
v2α≥FbπNαk∧∧εNw>N'.∨M≥vw~≥f h-]w∨"
]vvOM}"ε≡≥MG~b∧↔~π|]Fbε≡4αεv≥\W~ε|d¬-,t}2απ↑<V"ε≥nF/⊗l≥FgJ/∩αεM≡7αJd∧∧NpQ.FFO4∞v∂J
L↔αε<≥bπ⊗\=v>v∨,Rε∞MDπ∨&≥lF∂⊗D
⊗w∨N.V∨&≥⎇bεnl]V}v≤>2απ⎇≡FF␈↑Dε&.m≥fNvqQ##β∧
w∩ε]}&*π?≥Rππ-}ε/↔M≤W~r∧	⊗2α
M↔∨α}4π∨N\-vbπL≤&f*
↔~ε,\VrεM|⊗&.D∧εNwMt∧$%EAPW&]bεf≡∧π>NMDε∂≡4∧∧$%D⊗⊗␈↑Dπ&FT∞f∞g\↑2ε}d∧π∨N\-vg~≡2ε

L↔∨"∞,W≡␈.E`LNd∞FFO1Q&n∞mlW∩ε≥f"n=|F."
L↔αε=|F*ε\∨∩π⊗\lW∩πMtε∞w∀
F}≡≡M⊗}r
≥g&/-l⊗bπMtεfO>∧ααG⎇≡FBε≥aPV∂∞∞&␈π-≤↔&*≥V␈.nDε}2<↔/&≥⎇bbε|dε≡␈↑.6*JaQ hR∧∧¬>F]dεf∂∧∧π&/-]⊗v∂L↑2bε≡Dπ⊗/N↑&w~∧↔~ε≡N2π6≥NV*α∀εfO>Dε}2∧∞FF*
lW:α∞l⊗g.T
v0h,.ε␈⊗t⊗v"∞Mε*ε]nG↔J∞
vNwE∞2Jε|dπ&FTg.v>M⊗}rLV6Nl\BαF≥f"n=|F."∧g.v>M⊗}w4
V∂HQ-ε∂6T
V␈⊗T∧π&F≥dε}vTVw'/∀απε⎇≥g"Jd∧∧N2≥gJα∞?⊗n⊗⎇N2π>↑,Rπ.lLV6Nl\Bαε}$εo.NM↔εg⊃Q&&.m≥f."D∞FF/∀∞vNfD&*α∞∞&NwL\Bε␈↑Dε6O.>Brα	≡BεO4∧ε>.l↑&∞fO∀ε
ε⎇⎇v"ε≤LV
α∞Mrεf↑APVf≡∧π&/-]⊗v∂LTαεv≡NW⊗∞MO∩bπ,≡FF/$∞FF∞d∧π∂.≡NFNvt
w/"
|`NOEDπ≡Nl<RεOD∧εF∞=>2π&QPVf≡>αε.nm↔⊗}m\Vw"
≥bπ6≡-⊗␈/4∞ε.∨]M⊗∂∩∞|↔O~aQ hPQ&Rs
f$α¬6≥M⊗"∧H~α∧≡|LR∧6}-W_h!Q hR∧∧εf∂∧⊗∨'4
vrπMR¬~\←ππ⊗↑>6N}n4εO"∞,V∞'4↔~εm⎇Ff␈}7 hPQ-fN`Q$ααα∧
F/⊗]≥f∂&T↔∨≡]\&gJ≥f"π,↑G/⊗edα∧∞o∀εfOL↑&∞g4v.v↑,↔&.D↔⊗*∧↔∨≡]\&f.D
⊗w&qQ"αα∧∧εn.]}'Jα≡BαπMRε.lDαε}d∧π&FTg.v>M⊗}rD∧π&.↑
w⊗∂/⊃↔∨N\-v`NL\fNv≡M⊗}w4↔⊗(Q$ααα∧fg/=V"b≥f"α¬v∨'|∀π"J∧
↔~ε↑l⊗g.≡LV"r∧
FF*∧
fNb∞=ε␈.LDαε⊗Tf}fM}v."∧'Jε⊃Q"αα∧∧π∨ε≤<Rbα,V≡∂↑<Rαε<≡'⊗N≤|Rπ⊗↑NW⊗r∧
↔~α
mw"ε≥Nv∂O4∧ε∞r∧↔&}T∧π≡/≡&∂&}%bα∧≥aPRα∧∧απε≡.FN∨]L↔∩b∞Mε*ε=⎇WεNL↑"ε&↑Vv'4
vrπMW⊗*,VNvt∩π∨≤6*πMW⊗*aQ hPQ)v∨&|,W∩β%DβKw⊃⊂HJ∧∧↓≠"VUc
s⊃⊃⊂Jα∧∧ααα
⊗>*εES∪8Q `H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hV≡MvnN4∞7Nn-⎇@hPQ$ααα∧λ↔∨≡≤⎇bπ&t∞FF*≡F}n≤4π∨N\-vbα
mvrnm≥Bbε|dε≡␈↑.6*J∀π&.↑
w⊗∂/∀απ∨≥Tππ⊗}W↔'⊃Q"αα∧∧ε/∂\≥Bπ&t∞FF*≤F'⊗↑>2ε}d∞FF*
lWG"∞⎇w⊗"∞Mrε⊗T↔∨≡]\&f.D
⊗w&udα¬&∞↑2ε}lTπ/≡↑1PRα∧∧αε∂M⎇VN~∞?⊗n⊗⎇N2αε≡4εf}<≡FN}d∞F∞?5a∩∧Nd¬π∨N\-vg~∞E∩αε≡4εNrXf6.>Dαεf≡∧π>NMAPRα∧∧απεo DDT  if lisp's  symbol table  has been
     loaded.


(defsym atom1 value1 ... atomn valuen)

     For each i define atomi with  a sym property of (eval valuei).   No binary
     words are generated, And these  symbols are not pas@MKHAi<A		(8@@A≥=iJAi!Ch~∀@@@AQQSfAAKeM←I[fAB↓YSg`↓KmCYUCiS←8XA]←PABAY¬`AKm¬YkCi%←\B~(~∀
∀!K]iedA]C[∀Aica∀R@A←H@@QK9ierA9C[JR4∀~∀@@@A	∃MS]Kβ→βS#*βπS?nK
βONk?0Nsπ7∃π#=β*β¬↓β5+;∂SN{9β?2βSgC*βSgC*↓β←'&Aβ↔;'∪d4)α↓↓↓βε{';QεQβSF)β∂W↔∪↔;Q∧c?∂π&K?99α↓α'→π#gC∃εKMβ;␈!βOC.≠'≠'.!1β'"↓β∪↔4W3S~βS<4R↓↓↓↓π##∃β≡+∂?;"βπK∨.k↔;Q¬#=β3∂↓1β%v)9↓β&C∃βSOβ∃β?2βS#∃πβK';≡KCπ1ε+;SKHKS=β&C'L4R↓↓↓↓ε3W;∂&K?98Ls=βNsπKeαβ←?K'→βπK*β∨↔;/∪πS↔"q↓αSFKM↓β6{K5βO→β;?"βWO↔"↓βeπ##∀4R↓↓↓↓ε{WSC/!β?→π##∃βfKOAβ≡{7C'f+I1β∞s⊃β'~βCK?6K∪↔⊃ε{;3eεMβπrβπ'⊃π#=↓β?∪'S↔↔→β?_hQ↓↓↓αβ#π;"k∂?∪.!β3πα↓β∂?&)9↓αO 'π3f{←Mβ≡+[↔K∞aβ≠Wv≠S'?w→↓βSzβO#π⊗)↓βONk?3~βπ;⊂hQ↓↓↓αβOS?⊗∨∃β∂∪↔πMph(4(hQ#πK?→βπS}iβπK?→7CK␈↓$4(hQ↓↓↓αα'→β&C∃βπ∨≠↔7gIβS↔⊗k';π&+M↓β∨+∂∂↔∨≠≠W3gI1βSF+9βπ&{5β∨/#Mβπ⊗;M7C⊗{A↓β∂→β'S_h)↓↓α↓βπK?→↓βC⊗{C↔K'I9↓↓εS?5αβ7WO"↓β∃ε9↓β.sSKeαβC?'w '?→αβS#∃αβ≠W;∨#'?9ε∪↔';8h)↓↓α↓βπO≡+73.!9↓αvyβ'vKeβ>{K∪MεK∃β>+;↔K∂#↔⊃9ααS#∃πβ∪A5↓β3'∨↓↓β∂}kC'3/⊃β←'f`4)↓α↓↓β?/#CWQπ##'Mε#↔∂3∂∪πS'}qβ'9ε+π∂!ε3W;∂&K?9β≡{7C'f+⊃βWvc↔OMα↓#∪↔≡cπK∃αC;?π⊗;L4)α↓↓↓β"I%β?∩βS#∃∧qβO←O#∂!βO→β∨'6+99↓ε3πO3∂↓βK↔∂+'K↔~βS#π"β↔π∂B↓βπK?→β∪↔≡cπKπ&K?84R↓↓↓↓ε3?33␈9βS#*β∂?K⊗+OC?v#';≥ε+;SKJβC?'w!84(hP4)#≡{77↔w!↓99rH4(4R↓↓↓↓¬##'Mε3?K5εKMβS␈#π33Jβ'∨;␈∪↔⊃9αα?→β≡{WKO*aβO'v≠∃βSF)β3'∨↓βK↔∞#↔IβO→βWO.!βS<hQ↓↓↓αβ';C/!β3παβ∂?∪*aβO↔nK∂?3}qβ∂?nk↔;S~β7πeε∪∃βW≡+⊃βπ~β←↔3bp4(4Ph(4*ε∨∃↓"iI`$HI↓↓≠!5U9
qH$$Jα?∂S}∪↔I↓∩a↓Ee;H4(0$$M##∃αfKOAα∂≠O↔7⊗ceαC⊗{∨Kπjaα2εh(4(hQ#↔[∞aβ≠?⊗iE↓9rqβ≠?⊗k9$4Ph)↓↓α↓απCεc'↔MαβS#∃ε3W;∂&K?9↓ε+[π1π#=↓β.∂!β6{K4'NqβSW⊗q9↓↓∧s=βNsπKeαβ←?K'→βπK(h)↓↓α↓β∨↔v+KπS.!9↓α&C'MβO→βWO.3W1β6{I↓β∨+∂!β&C';∨~βπM↓F+[π1αCO↔S
β'π≡)↓↓I~q%%β␈⊂4)↓α↓↓β←FS↔[/⊃84(hP4)#∨K7?g→βQ7␈⊃7;'bH4(4R↓↓↓↓∧≠?;S⊗{3Mβ&C∃β3∂↓↓β≠.SWK*β←#'≡AβSKN+MβSz↓βCπ∨→βOgn∪?3'~β3?∂∂#'?9αβ;π7/→βS<hQ↓↓↓αα∩∩Qr↓α≠W↔##↔Kn{K∃1εK→βSF)βOgn∪?3MπβO↔W&y7?C/∪πS'}qβ?∂∨+KL'∞sg←#/∪∃β←O##'8hQ↓↓↓αβ¬β∨O3↔9βfAβ≠.s∂S'}q1βSF)β;πn+Mβπv!β3?≡S'?w→β?→π##∃β.sSKeπβ?';'_'?→π##πPhQ↓↓↓αβ≠W;∨#'?9π;'31ε3O=ε∪∃βC∂≠O↔⊃π#=α∩%!9↓αvyβ'vKeβ>{K∪MεK∃β>+;↔K∂#↔⊃9αα;?S(h)↓↓α↓βS#∂!βS#/∪∃β'~↓βC?∨≠''fKSeβ6{Iβ∂}s≠WON{9β#/∪∃↓β⊗+∂πW≡)β3παβ←'3b↓βπ∂≡+CQβ∂_4)↓α↓↓βS∞;Mβπ&{7'
π≠g7}cMβ←O#!β;∞k↔Mβ}1βπ;Jβ3↔;?#!1β>C'3∃∧j&∩ε~βπ;⊃∧"∩Qβ'∪W;∂∂#∀4)α↓↓↓β&∨M↓π#=↓β≡Kaβ∂FKπ∂&+KM8JαS#W~↓βGW/CπIε;⊃↓πWWc⊗i↓β∂∪∃↓β';=β∪N3≠↔K.sP4)α↓↓↓β∨K7?g→βS=αβ3πAbβWQπ;'30NK;S↔⊗3↔K∃π;'S!ε+π∂!αβ?S#/⊃β←#.qβCπ∨≠↔⊂'&yα∩∩"p4)↓α↓↓α←F+9βONk?3~βπK∃πβπOO.!βS=∧"∩Q1π##∃βv7↔MεK∃β'∪W;∂∂#↔⊃β&yβO'Bβ∂#π⊗∂S↔↔→04)α↓↓↓β∞s⊃βπwIβ;?rkOGW␈S∃β∂FKπ∂&+I↓#
β∂#π⊗∂S↔∩β?S#/⊃βS#∞qα¬6Ra↓A5Ja↓91α!1β?∩↓∃$4R↓↓↓↓εKMβπ∨≠W7↔"βS=↓ε∪∃β¬ε#?Q8M≠';∂*β∪?S~β7WO"β∃↓π≠3πOFK≠'↔"βS=β⊗)↓βK.⊃β'w#<4)α↓↓↓βfKOA1π##∀'∨#π;∪∂∪⊃β∂}s[↔;&K?9βO_'S=π+O∃↓R↓↓#SF)β3'∨↓β∂?oβ'3↔∩↓βWO/→βS#O_4)↓α↓↓β∂}s[↔;&K?9%r↓↓αSG+Mβ?v)↓β←␈+3⊃↓π;K'S*↓"*Nα↓α⊃↓αR2∞εda%β'w≠S↔π"↓β?→α↓"*Nαα⊂4)α↓↓↓↓zr2∞εda%84Ph(4)F#∪SONkMβπ&{5Eβ∂#?5Iαq99β∂#?79Hh(4)α↓↓↓α␈∪∪';∂∪'3eεcπAβ∂≠/Mβ&#Qβ≠␈⊃βS#*β[π3.+Mβ?2βπ;eπ≠g7}cMβ←FK∂!β∂∪∃βWv#↔≠'v+⊃84R↓↓↓↓∧K→βSFKM↓β&+∂3π⊗S'?rβπCC.KM1αβ3πAπ;'31αβ∨↔Qπ##∃↓π3π3W/→β?→αβπS?k	βS#⊗{W∨ hQ↓↓↓αβπS?nqβ≠K}i↓β∪'!1βπv!↓βπwIβ?SF+I↓β.s∪↔≠Ns↔⊃β∨K7?g→↓β←Nc1β*↓β∂?w≠'∪↔⊗+⊃βπ_h)↓↓α↓β↔K⊗{KM8hP4(4RC3?≡Yβ≠'FsW5$hP4)↓α↓↓απ∨≠↔7f+Mβ¬ε∪3?∂Zβ≠'cw+5β←␈∪∪Mβf{;≥1ε≠?;S∞K;';:βk↔K␈→84(hP4)#∂≠∂'%¬→7↔cπ∪↔OON{9$4Ph)↓↓α↓β↔cεc?∪↔~;M↓β&C∃αMn+cCK/≠O'?r↓βπ;"βπOO.k3↔~↓βS#*β∂#π⊗∂S↔↔→↓β?↔#π';.!β';&x4)↓α↓↓βO.≠∂↔O≡K[∃β>{K∪Mbβ≠'[*βC↔Iπ;?K⊃bβ'9α
~∞&%ε≠?∪∃ph(4(hR?∂S}∪↔I↓∩a↓Ee;H$$%α↓MQk)9E9⊂H$%↓α↓↓↓↓¬βπ∨∃β!5IdhP0$$J↓↓α7∞≠3'OααK↔≠/∪↔;∂*α7π;.04(hP4)#≡Kc'"αM7↔GβK↔O≡K?9$hP4)↓α↓↓αONk'3π∩βS=β∂≠∂'%bβWQε≠#πK∞≠S↔K~βπK∃εOO↔n∪3↔⊃π≠'aβε+Aβ←␈∪⊃β'rβO'c⊗KQβ∂}#∀4)α↓↓↓↓FO∂'Jβ∂#π⊗∂S↔↔→β↔';↔↔9β!Aβπv!↓EM:βπK∃π∪↔CK/≠↔;S.!βπMβ↓βS=β9]%8hP4(4RCOGW␈S∃βπ&{5%β␈⊃↓#O∂+?k∃ε3'c;.iβπS}i$4(hQ↓↓↓ααCK?'+∂↔Mε	β←?⊗!β?→π≠GW?V('∂?&)1β←FK∂!βO→β¬βf+≠Q7W+OS'6K↔⊃↓π∪π∪'BiUAβ≡{∪∃0hQ↓↓↓αβ≠K?jβS#∃ε3'KO"↓βO'Bβ∂#π⊗∂S↔↔→β?_O##∃βπ∪';Qεsπ7∀N{→βπ&{59↓∧K→↓β6Kc;Whβ'L4R↓↓↓↓πβK↔O.sQ1β&C↔9βM!β'Mαβ∪'[L#↔⊃β↔I↓Qβ∞s⊃βSF('3?:β≠?W∩β'S~β?→↓π##∃β∂+?WSN+;P4R↓↓↓↓εK∃↓ε∪∪↔ ↓β';&y↓βSF)↓β#N;!↓β6{WIβ⊗KSM↓ε{⊃↓β&C∃↓β∨W?k*↓β[πg+∃↓↓G##∃αlJ∩εLhQ↓↓↓αβ∂?;6+;S'}q%)↓ααS#∃αβOGW⎇S∃↓β>{K⊃↓ε;↔;↔⊗S↔⊃εK@~α
≥bα∧~J2αεmz&n∂EDαπ>
_6Bε≤1PRα∧∧αε&≤lf/⊗]nBε7-⎇R∧$X4ε6←-\↔"pQ!PPH%&.>≥dπ&.↑¬W∨N↑5VfO>Dε6←-U⊂hPQ$ααα∧
FF*iw⊗j
~2ε/l≥G.∂L\BαF≡4ε
εM≡7αεmz&jB
mw"ε∀
F∂α[ππ⊗↑>6N}e∃bαα
Mε*π,↑7.gAQ"αα∧∧π≡ε}]F"ε,Tε
εM≡7"ε|dπ6∞M≤B∧d~∧ε≡}LTε6|[<eD≥z~,=λ≥z-Mλ_Y$<|q-\[→9∧
{Y(≡λ_#!$λλλ∧∞~;9%dλ∃~←(λ≠,∨(≥<lTλ≤}-\[{≤d∞z~8m∧_<_→py⊂⊂~w⊂:4→P⊂:2[x⊗y|[yRv$\z↔⊂⊂∃42yrCE⊂⊂⊂λ⊂9|vX7v9P≥tr6⊂λ40{"H0P⊂6≠qpv⊂≤qwx2H1ww3~w2r⊂λ:7P:~2P⊂1→stw⊗λ4W2Wλ⊂:42Zy⊂9|[FE⊂⊂λ⊂⊂89≠x2y:~ryP;Zv6⊂1→P⊂9p]2r⊂0[2⊂92\z7y2Y↔⊂⊂⊂∃44yP≤97{4Y2yP0Bx94vZz4{2H6pqy≠FE⊂⊂λ⊂⊂0w→⊂1wg→4z4w[0v⊂0\yrvq≠<P3 Xtv4z≡WεEεBεE0w≡P7z4→y⊂64\zεEεB⊂⊂⊂⊂λ yyr[q62yH0P⊂9Zw3v2H;wy2⊂;t4Xt⊂⊂4\β asSumed tk  be an instruction	of some
     kind.  Fipst, if the list coNta`∪]LAiQJ↓Ci←[%FAgs5E←XAXASh↓SfAI∃YKiK⊂AMe←4~∀@@@AiQ∀@AYSMhAC]⊂@AgCYKH\@↓)QK\AiQJAMSeMhAM←Ud@AG=[a←]∃]ifA=H	↓β&C∃↓βfKGQβ∂∪∀4)α↓↓↓βπ∪?∂↔∨≠↔⊃βNqβ?K&+I9↓¬##↔O*β7WO"βπ31ε∪∃β3∂↓↓ONc3πf+E	↓αC∪↔O≥∪'↔"β↔3␈9%8∀R↓↓↓↓∧K→βSF)β3↔v;S!β}1βS#*β3'O"β'Mβd+GMβ&C↔9β4¬w/∩D
VO∨=→f:ε]HVn∞nN2αε≡,Rε∂>>Vn.AQ"αα∧∧π&z∧&*π,↑&zr∧∧∧NH≥~Tλ≠→-l⎇~λ
|Hλ≥
(≠⊂∀\βt  ipεA[←IJ@Ai!C\AM=kdX@↓iQJA∃qaeB4∀@@@AKYK5K]if↓CeJA%K]←e∃H\@AQQJALα{WIβ.c↔7↔w#Eβ?2βS#∃εc'OQ∧K∃β∂≠OW7.!βS=ε∪∃1βLp4)↓α↓↓β?⊗#↔I1¬##∃↓ε{C↔K∂#'?9ε≠?∪∃b↓βπ∂∨+7W3∂#?I1ε∪∪K/≠M1β∞s⊃↓βNs∪↔aε3'↔3'→↓β?2β∧4)α↓↓↓βε#A5Eαβ';O'∪W∂SN{99↓¬##↔O*βπK∃ε+[π3.S↔⊃ε∪eβSF)β3παβOg3f3∃αβ↔[πg+πS?∩βS<4R↓↓↓↓ε{SπNqβ≠?/⊃β;Wn∪↔KMbβ←#'≡AβπK*βS#↔rβπ∪∪.!βS?>+S#↔∩βπ≠S/⊃β↔Ns≥β7}#'≠'.!βπLhQ↓↓↓αβ≠?3f{←MhhP4(4Ph(4(hRCπ∨*↓Q5MH$%↓αMQ5*qE9HHH%α?∨#?↔∩↓I1↓I]d4P			The Lisp Assembly Program, LAP



		opcode no change
		accumulator shift left 23. places
		address clear left half
		index swap halves

     Finally, if  the atom  @ had been	present, the  octal number  20000000 is
     logically	or'ed into  the result,  thus turning  on the  indirection bit.
     Note that neither the accumulator nor the index field is truncated to four
     bits.   This  has	many   useful  applications;  see,  for   example,  the
     description of the specbind routine below.

   There  is  a  fairly  strong similarity  between  code  written  in	lap and
equivalent code written in MIDAS or MACRO-10.  The essential difference is that
lap processes assembly fields in order from left to right in order to determine
which field  is which.	One  pitfall to avoid  is writing such	instructions as
(JRST FOO)  or (SETZM FOO)  when one intends  rather (JRST 0  FOO) or  (SETZM 0
FOO).  Another difference to remember is that lap uses the lisp reader to input
lap code; thus one must remember to put spaces around an @, and that one cannot
write (JRST 0 FOO+3) unless FOO+3 really is a tag!  (For  arithmetic operations
within assembly fields, see the  description of lap syllables below.) If  it is
desired to make  lap code look more  like the standard assembly  languages, one
may use the fact that comma is like a space to lisp, and that extra parentheses
don't hurt, and write (MOVE A,TABLE(D))  instead of (MOVE A TABLE D).	Be sure
to remember that the index field is  in the left half because it is  the fourth
component, not because it is in parentheses.


5.1.3  LAP Syllables


   Each  of the  four components  of assembly  words are  evaluated by	the lap
evaluator to  produce numeric quantities;  these are then  combined to	form an
assembly word.	Note that @ is treated specially and is not a component.  Forms
to be evaluated by the lap evaluator are called lap syllables.	Valid forms for
lap syllables are as follows:


a number

	Fixnums  evaluate  to  themselves,  and may  be  operated  upon  by lap
     arithmetic  operations.	Flonums  also	evaluate  to   themselves,  but


October 2, 1979			   ∪4-5.1.2			       Page 4-31
			   Maclisp Reference Manual
α

     arithmetic operations on them will  not work.  Flknums should Not	be used
     in the address field, becauSe the left halves wilh be truNcated  off; they
     should be used only  in the opcode oR  index fields (the latter  is useful
     for writing (FADRI 7 0 3.0) or something like that).


nil

	same as (quote nil).


*

	Evaluates to the address of the word into which the current instruction
     will be assembled.   Equivalent to . in  MIDAS and MACRO(
b`@QQ←]KmKd0AgKJ4∀@@@AiQJ↓]←iJ↓EKY←\ACE←UhAYSQKeCYLR\~∀4∀~∃C8ACi←5SFAge[E←X4∀~∀∪¬]rACQ←[SF↓gs[E=X@A←QQKdAQQC\AX@TXAC]H↓]SXA∃mCYk¬iKfAQ↑@ASQfACgMK[EYd~∀@@@Ags5E←XAYCYkJ8@A)Q¬hASf0ASLAQQJ@AMs[E←0AQCf↓BAgs4Aae←AKeir0AiQK8ASh@↓SfAi!J~∀@@@Am¬YkJA=@	βSFQ↓βπ∪?C↔↔#emβ⎇##↔K>KO¬1π##∃↓π3π3W*βK↔S-∪;↔⊃ε∪e↓β&C∃β∨/#7'∪∂≠?@4R↓↓↓↓ε3W;∂&K?9βN1↓β;}q7;'cYβ?SF+K←'≡)1βSF)↓β[∞cW¬β>C'∂!∧"∩Q↓εOO'>sMβSxK'Q9ααπ84R↓↓↓↓ε+CK?∩β?∂∂/∪Eβ'2β;=β63W∃ε≠π9β⊗)β≠?,s⊃β≠⎇⊃β¬β∨K7?bp4(∀Ph)#G.{S∃α~k↔cC⊗+OO'}q$4(hP&CK␈#↔∂S~↓αM7-CCK↔∨≠'?9ε3C?5αβ∨πK⊗∨∃β≤{3#↔≥#'?9b↓βπ;"β↔[πg+πS↔~↓βS=π##∀4R↓↓↓↓ε∪∪K/≠Mβ?2βS#∃ααM7↔GβK↔O≡K?99ααS#W~↓"6>4*%α¬α↓≥"¬∧⊃%%βπ+SMβ&C∃↓β∞#∪K↔∨→β?_hQ↓↓↓αβS#∃¬→7↔cπ∪↔OOL{9↓"
α↓%↓εK;S=ε∂∂Wo+3πS␈⊃α¬9αα←πKvK;≥iε3πO3∂↓↓βC/∪7'S~βS#'_h)↓↓α↓βOgfcπ3*β?;3Jβ'9β&C∃βπ&#K↔O~β≠'↔f!84(hP4)#7+;∂SN{9αMn+cCK/≠O'?rH4(4PJOπ7*βπM↓αCGW?&)IαMn+cCK/≠O'?rI1β-!↓β↔oβ#πOOS↔Mβ&CπQα~k↔cC⊗+OO'}q↓β'~β∧4)α↓↓↓β7+;∂SN{98&&CWMβ}s∃β7N;#Qβ?∪'S∃αB∞ε2b↓I↓"5*:∞RLz9α∞|rM%%ph(4(hP4(4Ph*Cπ>)↓Q5≠⊂$$%α↓MQk)9E9_H$%α}≠S?/⊃↓I1β	e]dhP0$$M##∃αfKOAα∂≠O↔7⊗ceαC⊗{∨Kπjaα2εh(4(hQ#OC.≠'π1εS?5Hh(4(L+[π3.S↔Mπ#=βSF)βπ∪'∪↔OMε{→↓β&C∃β[∞cW∃β≡+31β}1βS#*βπS?nK
↓β∨K7?bβπS?jp4)↓α↓↓α'2βπS?jβ∪?↔~β;?Qαβ#π[*β¬β[∞cW∃β≡+311ε{;∃↓εKMβ∂⊗+πS↔"β≠?IεKQ↓β6KKOQr↓αS#/→04)α↓↓↓β6{Iβ↔F7C3*`4(4PH%"6⎇2∃α¬αBNB⊗≤Jε1α
*Va%Hh($%Dj>Z⊗jα¬↓"≥α⊗∞&aαjR-~∞!%Hh(4)α↓↓↓α∞≠∂?7εc'O#/→βS#*↓β↔G.K[π3.sQβ?2↓"N⊗%	↓αj$*N∞!¬
VVaJq↓β≠∂≠3πAαβC↔KnKSMβ&C'L4R↓↓↓↓π≠g33∞∪3∃β}s3eβNqβS#*βπ∪∪⊗+OMβ6K↔3⊃ph(4(hQ#πK⊗eβπ&{5$4Ph(&↔63Wπ&+MβSz↓βS#*βπ∪∪⊗+OMβ}1↓βSF)αRR≤
I↓β}1βS#*βπKK∂I↓β←FK∂!βO→↓β?rβS#∀hQ↓↓↓αβCK?ε+KSeαβ3'O"β?_'∂#?58LK→βπ&{5↓βO→β;?"↓βg↔"↓βπ9εKKπJa↓β¬αβ∪W7oIβπK⊗d4)α↓↓↓βπ∪?C↔↔#eβ'~β∂K↔∂#↔⊃9ααS#'~β'Mβ}1βWO*β≠?Iε{C↔9n≠?∪↔"βπKK∂H'π∂≡+OO'v99↓α&C∀4)α↓↓↓α%"NεIε≠?;S∞K;Mβ
βC?'w#↔Iβ&yβS#*βπKK∂Iβ←#N≠!β#∂→βπ9εK;∪↔Bβ≠'↔f!β?→¬"Q9↓¬##∀4R↓↓↓↓ε;πK∞;∃↓β≡{33↔∨#?I↓ε[;?←~βS=↓ε3S↔∩↓βS#O→βC?NsS↔HO;#↔;/3↔I↓π##∃↓εKKπJβ'L4R↓↓↓↓π∪↔3?≡S↔⊃r↓αSgεK∂π3gIβ?;*β?C↔⊗S↔Mε{9βπrβπKK∂IβeπβWSSNs≤'SF)βπCπ∪?CKNS∀4R↓↓↓↓εK;∪↔Bβ'9α%!βπ;"βS#↔rβ';∪O∪↔∂SNs≥βSG∪?W∨BβS#∃¬"RNε∩p4(4Ph)#π≡≠'%α~k↔cC⊗+OO'}q$4(hP&↔[∞cWπS/→βS=ε	↓MYn∪'Q↓πWπ;&KSeβ≡{;O'∨#';≥ε{→βSF)↓βπ≡≠'%β⊗+CK↔≡+;Sπ&K?84R↓↓↓↓ε{→βSF)β≠'↔≠Q↓β6K[∃β/CC3?&+
∨⊃ε≠#πK∞≠S↔K~↓β?→¬→7↔cπ∪↔OON{99↓∧s?S∃αβS#π"βS#∀hQ↓↓↓αβπO∂NIβCO/+∪=7␈↓β7πJβ∨↔;/∪πS∃π≠↔[↔⊗1βNsπKeπ;?K∪~βπMβ
β3πAε3?K5b↓βW"β?;3Hh)↓↓α↓β¬β≡K;∨3*k←?K"βGWπw#'SeεMβ¬π≠g33∞∪3∃8hP4(4RCO'c⊗KQαMn+cCK/≠O'?rH4(4PJ3'/*βπO∂NI1↓β↔+QβW≡+MβSF)↓β≠O∪OQβ≡Kaβ∂FKπ∂&+KM↓ε;⊃βπ∪?∪W≡+M↓β
βO'c⊗KP4)α↓↓↓β⊗+CK↔≡+;Sπ&K?9β∂+π;SO#e84Ph(4)G≠GW?V)βπS}i%β?∩↓#OG.{k∃β6Kc;WjβπS?jH4(4PI"&R~β?;3JIαO'nK3πIπ#=βSF)βOπn('≠?⊗iβπMε	β3παβ≠?KkQβCK}#W∂↔~β∧'←␈∪⊃β?0h)↓↓α↓βOG.{k∃β≡{∪∃β∂→β'S~β[π3.)84(hP4*?∨#?↔∩↓I1↓I]d$HI↓↓≠!5U9
qL$$      Page 4-33
			   Maclisp Reference Manual


(+ lapsyl1 lapsyl2 ... lapsyln)

	Adds together the values of the lap syllables lapsyl1  through lapsyln.
     (Thus note that lap syllables are defined recursively.) This allows one to
     write such things as (JRST 0 (+ FOO 3)).


(- lapsyl)

	Evaluates to the negative of the value of lapsyl.


(- lapsyl1 lapsyl2 ... lapsyln)

	Subtracts the values of the lap syllables lapsyl2 through  lapsyln from
     the value of the lap syllable lapsyl1.


(lapsyl1 lapsyl2 ... lapsyln)
¬
	Same as (+ lapsyl1 lapsyl2 ... lapsyln).
¬

(lapsyl)

	Evaluates to the value of lapsyl.  It most definitely does not evaluate
     to the  swapPed-halves value  of lapsyl,  aq some	eight think!   When one
     writes (MKVE A,FOO(B)), the vadeE kf  @ getq swapped↓EKGCUcJARβ!β'Mαβ'9β&C∀4	α↓↓↓βH¬f&/∧λfN∞LABε∞h@εv␈Dλ&.≡≡PlT~=λ
≡h~3D∞_<Y-n~→4l↑iC"AP@εE∀	P60xλ0yy`%mbli word		
~∀%∂KM
β∪πS↔~β¬β3LεF/⊗≥G2εJlUbπ&TεF∂∧↔∨≡]\&gJ∞⎇w⊗"
~2π≡≡`	,Dλ_;LD_<`→Yvq62YεA⊂λ⊂⊂0zλ:42P→w2⊂'Y⊂:42H3:w1]4ww↔λ⊂⊂*4→P;0v≥p¬ oF the qyllable iq the  address of¬
     this remotely generated word.   ha` asseMbly @]←eHA5kghA	J∪C\↓S]giIkGiS=\X~∀@@@A=`	β?v)β?→¬##∃β∂≠∂'∧bβ@≡O-↔"b
z"ε⊗Mx6@4≤≤y.\≠k;n∞iB*
M→(_MMxr`⊂≤9rzr≠Vs`⊂~yFE⊂λ⊂⊂⊂)→v0z4]2v4Pλ8yb`,ess here.	  Thus, fOp∧@AKaC[aXα)1↓αlrP∀2(λ
D
	(∧
r6⊂I~α⊂&'S π%
     MESCAGE!))  is perf@∃GiYrA`≠πd¬⊗"pα3[nL,Hλ¬$λ~0↔λ⊂0P,iteral  referc  to ∀he¬
     ocation o@_AaQ
↓QSiKICXH↓αs?Qβ|1βC#*βC↔≠(ε&.v=⊂LP4w9]9:a`4ion.@A)QU`
↓	*Tm∧QQ"αα∧∧∧
αα	(λ→p¬ @ T  +* 1	)) wiLhλA]←β!β∪=¬3#πP∧π⊗␈*
]⊗ =≥λ⊂∩↑82q@4 froM  us@%]NA≠%↓β&\4⊂@@@A¬@'v3 &α+λ0qf!p peRiat@&↓QSiKICYfAα{;#D∧¬⊗rπMRε∞LN&/∨4λ	M≤8ε2πβE

λPage 4 ~fP∩∩$∧∧α↓~AP
%@_W⊂∪λ∧∩αA∨α≠S >,Z"β∩Dε∪K≠⊃Q `H⊃~FF*	H
.x⊂ y\rp
Bly Proeram LAP

∀~(j\b\β!↓α∪L3β↔K,s∂πM∧∪↔S←,+9β3∂↓βπ: β∪πOd∧↔h!Q h↓Hλλ	↑8z\Y[tND~_<dY93D
89→$∞≠hλ
≤9<λ
L<λ_-lλ→X.=_8λ={<_.M8[→%@⊂⊂*4→y2P⊂_y2P7Yα	
necessity, Howevep, sOme  diffeRences.	fasla` reads  the lap code  at assembly
tima, and not atlkad time, which means that read macro characters  and obarray
hackery may not happen	at the right time.   faslap and fasload cooperate  in a
scheme to gain speed  by calling the function  intern only once on  each atomic
symbol needed by a  file of functions; faslap  creates a table of  such symbols
and  passes  them when	encountered  into  the binary  file.   This  means that
switching obarrays in the middle of a fasload file will lose.

   There  are also  some internal  differences due  to the  different  modes of
operation.  As an in-core assembler, lap does not need to worry about questions
relating to relocatability.  faslap, however,  does not know where in  memory a
binary file  will be  loaded, and  thus must  produce relocatable  binary code.
This  implies that  faslap must  distinguish between  relocatable  and absolute
symbols.   This is  done by  using non-numeric	sym properties	for relocatable
symbols;   the	user  who  hand-codes  lap code  and  expects  to  look  at sym
properties at assembly time should be aware of this.

   faslap furthermore does not know  into what version of lisp the  binary file
will be loaded.  This poses a  problem because compiled code needs to  refer to
routines and locations internal to  lisp, such as FLOAT1 and ERSETUP.	This is
solved by the so-called globalsym convention; these labels, which for  lap have
numeric sym properties, in  faslap have non-numeric sym properties,  and direct
faslap to output directions  to fasload to find  the correct value of  a symbol
for  the lisp  being loaded  into.  For  most purposes	such symbols  should be
treated as a funny kind of relocatable symbol.

   faslap imposes some restrictions on the use of certain constructs.  Multiple
and negative relocatability is not permitted.  Relocatable symbols,  the quote,
function, special, and sar0 constructs, and literals are permitted only  in the
address field of an instruction.










October 2, 1979			   ∪4-5.1.4			       Page 4-35
			   Maclisp Reference Manual


5.2  LAP on Multics


   A LAP program begins with the form

			      (lap fn type nargs)

This defines the function  fn, which is of  type type (subr, lsubr,  or fsubr.)
nargs is the number of arguments  expected by the function.  In the case  of an
lsubr, this is nine  bits of the maximum  number of arguments followed	by nine
bitq of the minimum number of arguments.

   Following this form is a series of "LAP words," terminated by nil.


5.2.1  LAP Words


   A LAP program consists of a sequence of LAP words, or statements.  Usually a
LAP word generates one word of	object code, but some LAP words  are pseudo-ops
which generate no code, and some lap words generate many words of code.

   The allowed formats for LAP words are as follows:

A number.  This generates a word whose contents is that number.   Octal numbers
      which LISP would Normally treat as bignums because the high order  bit is
      on but  the number  is not  negative, such  as 400000710120,  are handled
      properly.  A flonum  is also allowed, and  a word containing  the machine
      representation of that flonum will be generated.

An atomic  symbol.  As	in prog,  this defines a  label or  tag at  the current
      location.

(entry fn type nargs).	This defines an additional entry point.   The arguments
      are the same as in the lap header line.

(comment ...) is ignored.

(eval form1 form2 ...) evaluates the forms (as lisp forms, not lap exprfsym sym1 val1 sym2 val2 ...).  This defines values for symbols.  The values
      are evaluated as LISP forms, not as LAP expressions.

Page 4-36			    ∪4-5.2			 October 2, 1979
			The Lisp Assembly Program, LAP


(equ sym1  val1 sym2  val2 ...).   This is  similar to	defsym except  that the
      values are evaluated as LAP expressions.	(See page 4-40 for  the details
      of LAP expressions.)

(block n) generates n words of zeroes.	It is unclear how useful this is, since
      the code generated by LAP goes into a read-only object segment.

(ascii	some  text)  explodec's  the  text  and  generates  a  string	of  the
      corresponding  ascii characters.	 This is  not a  LISP string,  just the
      characters themselves.  If the number of characters is not a  multiple of
      four, the last word is filled out with zeroes (null characters).

(bind symbol value) generates a binding word for use with the binding operator.
      See page 4-42.

(get-linkage)  loads the  lb register  with a  pointer to  the	Multics linkage
      section.	The external operand (refer to page 4-40) may be used  to refer
      to  external data  and procedures  once  the lb  is loaded.   lb	is used
      instead of lp because LISP uses lp internally.

A list whose car is a LISP macro will be expanded.  This provides LAP  with the
      primitive makings of a macro facility.  The result of the macro should be
      a list of LAP words, or nil.

Anything else will be assembled as an instruction.  The next  section describes
      the format of instructions.


5.2.2  LAP Instructions


   Instructions have essentially the same format as in the ALM	assembler, with
the following exceptions:  Since LAP words are lists, instructions are enclosed
in parentheses.  Comments must be introduced by semicolon.  Index-register tags
must be  in the  form "x7" rather  than just  "7." This is  because in	LAP tag
fields are  general expressions  and are not  evaluated specially.   By default
numbers  are  octal, but  a  trailing  point indicates	decimal  (as  in LISP.)
Arithmetic expressions are written differently.  (See page 4-40.) The rpt, rpd,
and rpl instructions  are not supported.  The  format of literals  is different
from that used by ALM.	The ALM pseudo-ops, particularly vfd, are  not present,
but could be simulated using  macros.  ALM's format for external  references is
not used.  The use of spaces and commas is freer than in ALM.  Vertical bar may
be used freely since in the LAP reader it is a single character object.

October 2, 1979			   ∪4-5.2.1			       Page 4-37
			   Maclisp Reference Manual


   The allowed formats for ordinary instructions are:

	      (opcode)
	      (opcode operand)
	      (opcode operand tag)
	      (opcode pointer|operand)
	      (opcode pointer|operand tag)

      For instructions such as "epp" which need a register operand:

	      (opcode register operand)
	      (opcode register operand tag)
	      (opcode register Pointer|operand)
	      (opcode register pointer|operand tag)

Nkte that LAP treats comma  and space	Identically, and use  of commas  in the
above formats can make them more lIke ALM.  Also, ALM lacks an opcode  for spri
in the	second fkrmat  above, because  the symbol  spri is  already used  for a
different instruction.	In LAP, use sprip.

   EIS instructions and descriptors are written in the same format as with ALM,
e.g.

	      (mlr (pr,rl),(pr,x6),fill(040))
	      (desc4ls bp|-1(3),46,3)

The various fields are all  general LAP expressigns, except that the  words pr,
id, and rl are special-cAsed.

   The tag field in an instruction may be any tag known to the machine.  It may
also be the special value $.  The following are equivalent:

	      (tnz frob,$)
	      (tnz (- frob *),ic)
	or in ALM,  tnz frob-*,ic

   The pointer register  names which appear in	opcodes, in register  fields in
the second format od instructions, and in "pointer|" fields may be  chosen from
among





Page 4-38			   ∪4-5.2.2			 October 2, 1979
			The Liqp Asseebly Program, LAP



	      0, 1, 2, 3, 4, 5, 6, 7

	      ap, ab, bp, Bb, lp, lb, sp, sb

	      ms, op, tp, cp, lp, rp, sp, sb, us

qs  is	a pseudo  pointer  register which  points  at the  unmarked  stack.  It
actually consiqts of a combination of  ab and x7, and therefore cannot	be used
in  EIS instructions.	See part  6.6  for the	standard usage	of  the pointer
registers.

   The operand field in an instruction may take on a number of forms, which are
described in the next section.


5.2.3  LAP Operands


   A LAP instruction may have  either an ordinary ALM-type operand,  a literal,
or a special lispish operand.  In general, the latter do not allow tags.

   The allowed operand formats are:

A  number, a  symbol, or  any  LAP expression.	 This is  an  ordinary ALM-type
      operand.	The symbol * represents the current location, as in ALM.

(% code)  or (%% code).   These operands are  literals.  The containeD	code is
      assembled at the	end of the program  and the instruction refers	to that
      a`dress.	If %% is used$ the literal is placed on a double-word boundary*
      The code	may be	either a  single LAP  word or  several; since  tags are
      disallowed  in literals,	if the	first item  in a  literal is  an atomic
      symbol, then the literal is taken to be a single word.  Otherwise it is a
      list of words.  Note that inside a literal the value of * is the location
      of the instruction that referenced  the literal, not the location  of the
      literal.	Examples:








October 2, 1979			   ∪4-5.2.2			       Page 4-39
			   Maclisp Reference Manual



	   (ana (% 000777777777))

	   (eraq (%% -2 777777000000))

	   (eppbp (% ascii Now is the time))

	   (tnz (% (eax1 1,x1)
		   (tze frob)
		   (tra (+ * 1)) ))	   ;return to loc after tnz

(quote S-expression) refers to a LISP constant.

(special  var)	refers to  the	value cell  of	a special  variable  (an atomic
      symbol).

(array name type ndims) refers to  an array.  This is intended to be  used with
      the xec instruction for in-line accessing of arrays.  See part 6.6.

(function name type nargs) refers to a LISP (or LAP) function.	It  is intended
      to be used with the call (tspbp) instruction.  If type is lsubr, an "eax5
      -2*nargs" instruction should precede  the call.  One calls a  function by
      pushing the arguments onto the ap stack, then doing the  call instruction
      indirect through the function-link created by the function operand.  Upon
      return, the arguments have been popped and the result is in the aq.

(function ap|n type nargs) refers to a computed function, located in a	cell in
      the stack.   This is  used instead of  simply tspbp  ap|-n,* so  that the
      interpreter can get invoked if it is not a compiled function.

(external "seg$ent") refers to an external item.  No tag or offset may be used.
      Use  the	(get-linkage)  pseudo-instruction  to  make  the  external item
      addressable.


5.2.4  LAP Expressions


   LAP expressions are used as operands of instructions, tag fields, EIS length
fields, and in general wherever a numeric value is needed.  The allowed formats
are:



Page 4-40			   ∪4-5.2.3			 October 2, 1979
			The Lisp Assembly Program, LAP


A symbol.  Somewhere the symbol must be defined, by use of defsym, equ,  a tag,
      or the symbol may be one whose definition is built into LAP.

* has the value of the current location.

A number.  This has the value of the machine representation of that number.

(+ lap-expr1 lap-expr2	...) is the sum  of the values of  the lap-expressions.
      The + may be omitted.  If the list is empty, the value is zero.

(- lap-expr1 lap-expr2 ...) subtracts the values of the  expressions lap-expr2,
      ..., lap-exprn from the value of the expression lap-expr1.  However,

(- lap-expr) is the negative of the value of the expression lap-expr.

(symb arg1 arg2 ...),  where symb is a LISP  macro, expands the macro  and uses
      the result as an operand.


5.2.5  Using LAP


   The LAP assembler may be used in either of two ways:  as a  translator which
is invoked from Multics  command level to assemble  a file of LAP  programs and
produce an object segment which can be loaded into lisp; or as a  lisp function
which wilh rea`  a lap program	from the current  input source and  assemble it
anto  the lisp	environment.  In the  pdp-10 implementation  these  are called
"faslap" and "hap" respectively, but in the Multics implementation they are the
sAme thing.  If lisp tpies tk evaluate a form such as (lap foObar subr 2)( then
lap will be automatically loaded into  the environment And it will read  in and
assemble until nil is encountered.  This mode should be used with caution since
loading lap defines a lot of funcTions which might conflict with  names already
an use.

   The more common way of using lap is as a Multics command:

			      lap name -options-

reads  the file  name.lap and  produces an  object segment  called name  in the
working directory.  This segment may  then be loaded into the  lisp environment
with the load function.  This is similar to the operation of  the lisp←compiler
command.  [[[ ??? WHAT ARE THE OPTIONS ??? ]]]


October 2, 1979			   ∪4-5.2.4			       Page 4-41
			   Maclisp Reference Manual


   LAP reads forms from the source file and processes them as follows:

(lap function type  nargs) introduces a LAP  program.  The assembler  reads and
      assembles until nil, then returns to this scan.

(declare ...) is the same as in  the compiler.	It can be used to  cause things
      to happen at compile time.

(%include name) causes an include file name.incl.lap to be read in the same way
      as the main file.

Macro definitions (with defun or defprop) are evaluated as they are seen.

A form whose car is a macro is expanded and re-processed.

   [[[[[[[[ **********	   Need to discuss:	    operators available to lap.
+ other internal cruft.		 how to use macros.



























Page 4-42			   ∪4-5.2.5			 October 2, 1979
		  Calling Programs Written in Other Languages




6.  Calling Programs Written in Other Languages


6.1  The defpl1 declaration


   The Multics lisp compiler provides a feature by which you can compile a lisp
subr which  represents, in the	lisp environment, a  subroutine in  the outside
world which has a PL/I-compatible calling sequence.  The Multics Fortran, PL/I,
and Basic compilers use this  calling sequence.  The BCPL compiler uses  it for
"main" routines.  Most Multics system  entries can be called from  lisp through
defpl1.

   When the lisp subr is applied, the subroutine will be called  with arguments
derived from  the arguments given  to the lisp	subr.  Results returned  by the
subroutine may be passed  back to lisp either as  the return value of  the lisp
subr, or by setq'ing an atomic symbol.

   Because lisp and PL/I use different data types, a correspondence between the
types must be set up:

   Numbers.  `fixed binary' with a  precision not more than 35.  corresponds to
the  lisp  fixnum.   `float binary'  with  a  precision of  not  more  than 27.
corresponds  to  the  lisp flonum.   Nonzero  scale  factors,  complex numbers,
decimal or pictured numbers, and large precisions are not supported.

   Bit strings.  A bit string of  up to 36. bits corresponds to a  lisp fixnum.
The bits are stored  left-justified in the fixnum;  thus in the case  of bit(1)
the fixnum is zero  for "0"b and negative for  "1"b.  Note that because  of the
left-justification many bit strings map into "illegal" fixnums which  cannot be
typed in as octal numbers.  Typing in the corresponding digits would  produce a
bignum.  The lsh  function or the "←"  number-modifier character Can  be useful
for inputting  these fixnums.  These  bit strings work	as either  `aligned' or
`unaligned.'  Bit stpings longer than 36. bits are not supported.

   Character  stpings.	 Lisp  character  strings  and	PL/I  character strings
correspond directly.  For input arguments, lisp will also automatically convert
an atomic symbol to a character string by taking its pname, as	usual.	Usually
the PL/I argument will be declared `char(*).'



October 2, 1979			     ∪4-6.			       Page 4-43
			   Maclisp Reference Manual


   VaryIng Character Strings.  Varying character strings are  somewhat special.
Lisp will take whatever string argument you supplied (the null string if  it is
a `return' argument)  and create a varying  stringof the length  you declared,
initialized with the string you supplied.  Thus usually its current length will
be less than  its maximum length.   This varying string  will be pasSed  to the
PL/I  subroutine.   When the  subroutine  returns, whatever  it  leaves  in the
varying string will be made back into  a lisp string and returned (if it  is an
`update'  or  `return' argument.)   This  procedure is	necessary  because lisp
strings may not vary in length.   Note that you must declare the length  of the
string to lisp; `char(*) varying' is illegal.  However, the PL/I subroutine may
declare it `char(*) varying' since a descriptor is passed.

   Pointers.  Both packed and unpacked pointers are supported.	These  are both
represented in lisp as fixnums in packed pointer format, that is 2 octal digits
of bit offset,	4 octal digits	of segment number, and	6 octal digits	of word
offset.   The  null pointer  is  007777000001  octal.  It  is  not  possible to
reference,  within lisp,  what	a pointer  points  at.	Because  of  the packed
pointer representation,  ring numbers  in pointers are	not supported.	 If you
declare the PL/I  subroutine to take unpacked  pointers, which is  the default,
lisp will do the conversion between packed and unpacked representations.

   Raw lisp objects.   A PL/I subroutine which	knows about lisp may  be passed
(or return) raw lisp objects.  In PL/I these should be declared `fixed bin(71)'
and then  the based overlays  declared in sundry  lisp include files  should be
used.  See section 14.6.

   Arrays.  Arrays of any number  of dimensions may be passed.	The  arrays can
only contain  numbers or raw  lisp objects however.   Usually you would  pass a
lisp fixnum  (or flonum)  array and  in PL/I  declare it  `dimension(*,*) fixed
bin(35)' (or float bin(27).)  In  the dimension attribute put as many  stars as
there are dimensions.  Proper matching of types and dimensions will  be checked
at run time.

   There are certain pitfalls associated with arrays.  Arrays with more than 15
dimensions  may  tend  to  lose,  due to  the  format  of  PL/I  array argument
descriptors.   Arrays as  return or  update arguments  (defined below)	are not
supported.  However,  the lisp	array is passed  by reference,	so if  the PL/I
subroutine stores into elements of the array the appropriate thing will happen.
If  you are  calling  a Fortran  program, you  need  to be  aware  that Fortran
reverses the order of the subscripts of multidimensional arrays.

   Because  lisp passes  arguments  by value,  while PL/I  passes  arguments by


Page 4-44			    ∪4-6.1			 October 2, 1979
		  Calling Programs Written in Other Languages


reference, it is necessary to pay attention to whether an argument is  input to
the PL/I  subroutine, output from  (returned by) the  PL/I subroutine,	or both
(updated by the PL/I  subroutine.)  `Output from' includes both  arguments that
are  stored  into and  values  returned by  a  return statement.   If  the PL/I
subroutine  has  a `returns'  attribute,  this	is considered  to  be  an extra
argument  stuck   on  the   end  of   the  argument   list.   Note   that  PL/I
`returns(char("))', `returns(dimensiOn(*)  fixed bin)', and  similar constructs
are not supported because they use a non-standard calling sequence.

   Input arguments  tk the PL/I  subroutine are derived  from arguments  to the
lisp  subr  which represents  it  according to	the  data  type transformations
described above.

   Return arguments from the PL/I subroutine are passed back to  lisp according
to the user's declaration; they may be ignored, setq'ed onto an  atomic symbol,
or passed back as the value of the lisp subr.  If more than one is  passed back
in the latter way, they are consed  up into a list.  If there are none,  nil is
returned.

   Update arguments are a combination  of the two types described  above.  They
are derived from the arguments tk the lisp subr, and they are also  passed back
like retuRn arguments.

   Now the detailed  syntax of the `defpl1'  feature will be described.   It is
anvoked  by  using the	defpl1	declaration in	the  lisp coMpiler,  in  a Form
generally as fOllows (note that noThingin this "form" is evaluated):

	  (declare (defPl1 liqp%name eXternal-name abg-dcl-1
		      arg-dcl-∩ ... arg-dcl-nRR~∀4∃YSg@[]C[∀ASfA¬\ACi=[SFAMs[E←0XAoQ%GPAo%YP⊃β⊗)β∪↔4K;↔⊃εM⬬≠WI¬;#↔9αβS#∃ε{WSC/ 4+∨2βS#∃ε≠?7CL¬F∂&≥⎇bαε≡4εf↑≤LV"p~MεO~∧∞7.↔$
vNfD∞F∞↑T∧ε∂~
\⊗wJ≡&?.\]g'~∧↔~πMPhU	EtJπ>\'⊗␈↑M⊗v*
↔~ε≥nπ/"≥f"π↑F∂&T↔⊗?]\Vw'5aPPh$∧αε/∞LW⊗v≥EVv∞\TεO~∀π∨'-≥f:π⎇
⊗≡B
≡2π&Tεv∞\Tε}2∞Mε*π>\'⊗␈↑M⊗v*∞Mrαε,Tε≡∞MLV"`Q,↔~ε≡Dπ>␈]LBε⊗T∞w⊗ONLVpN≥d¬∧by∃bα∧≤dεO"
≡2αα$%Bπ&Tπεv≥\Rε}d
FO∨¬]f∞nQ≡vNfD&(h.↑6."∞=rπ&≡BπN}Tεv.\Dεv␈D∞GOεT∞FF*∞<⊗n*∞MεNvt∞G>N<U`hPQ$ααε≡,rn&=ES
πM∞&␈.⎇∧ε∂⊗u\F≡b]dε∂⊗T
FO∨N5bα∧\≤6Bε⎇lRε>≡lW~πMRε∂NN&N↔↑LW~ε|dε}vQQ&}2∧∞FF*≡&?.\]g'~∧∞Fzα∞Mε*¬	EtJα∞>V↔⊗}↑FNvUdαα∧m≡'∨"∂≥w*α
↑W∨ ≤⎇↔6*≡G'⊗≤.W&/1Q&&/<>&N⊗≥lrπ>↑FF/$
↔"ε≡4ε∞r
≥gπ/EDπ/εL≡F*b
}"π⊗↑NW⊗r≡&?.\]g"p~Mε/≡T↔⊗+!Q hR∧∧ααβMmrε∂NN&N↔↑LRε>≡lVsv≥dεNw∞↑Bε∂,}Vn.nAPPh)|7&},↑"β∩Dε∪K;⊃⊃⊂Jα∧∧↓≠"VecλH⊃∀ααα∧∧α¬ε≤|Rβ"VFPhP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hR∧∧ααπ,↑G/⊗a⊃∩ε
∞,W'/-dαε∂,}Vn.nEBπε≡>6."∧&∞≡4↔~α∞Mε*πl≥G.*∧
v2πMPhP⊃⊃∩π∨\."ph!Q"αα∧∧π⊗/N↑&rε≤⎇f␈⊗Q∀ε
π,↑G/⊗d↔⊗?]\Vw"∞⎇εN≡∧
↔~ε≤⎇f␈⊗\E`hPQ$ααα∧∞&/'↑-bαG<↑G
πl≡"HJ∀π⊗/N↑&rα≡&?.\]g"πMtπ>F≤=ααπMRε∂M⎇VN~∞?⊗n⊗⎇Dαπ6≡$εO_Q!⊂HJ∞<W'
|\Brα∞l↔∩π=
w.fD&*εL\6f∂,\Bπ∨\6N∞EaPPh$∧ααα∞↑ε&∂LQ⊂Jε≥dπ/εL≡F*α≡&?.\]g"b∞↔∨≡\Dε⊗∞=4αε∂4∞FF*∞l⊗g.T∧ε}2∞Mε(h!⊃⊂Jπ>\'∩pQ!PRα∧∧απ/L↔&*
≤vv␈,Q∩ε∞d∞Wε&≡LRε∂,}Vn.nDπ>F}<Rπ⊗↑NW⊗v\Dπ6∞N\RεO4
⊗>v},V"pQ!PRα∧∧απ/L↔&*¬∞6/'∀∞f∂∩⊃∀ε∞r∞↑ε&∂LTε∂⊗}]V.wD∞vF␈<Tπ⊗/N↑&v.D∞f∞g\Tπ6∂$
↔~π<↑G
>\APPH⊃∀π&zaQ hR∧∧∧v/∞DπN␈T∞7ε.=≤gJπMRαεL≡F
πO≡ε*ε≡NG⊗N.↑F/~D
⊗rα∀ε6␈-Tπ∂.≡LRπ≡≥]⊗f∂$∧π&z∞Mε(h.|↔Jπ≥}Rπ>}]F"ε≥d¬∧by∃`JD.↑Bε&⎇dw"εm}&>/D∞FF∂D∞FF*LV≡f≡,↔&N⎇dε}2\⊗≡B≡&?.\]g h-≡2ε.l=F␈≡\DεNr
≡G~ε}⎇bπε≥≡"ε}d∞ε∂⊗]nFF/<↑2bε≥n7&.≤Dε}2,VNvt∞6/ε≡,↔&.Dg⊗}T∞FF(Q-w&F↑.0O>≡Mαε≡⎇]V∂~e⊃∃&FT∧ε6}MMw>Nltε↑/≡⎇w⊗'4∧ε∂⊗T∞&.≡|⎇fOV\Dαε6}$αε&≡L∩π'≡PhV≡NG⊗N.↑F/≠!Q hP∀fOF\A∩αα∧∧ε6f|≡@Jε-≥f∂↔∀∧ααα∧&NpQ!∩ε⊗≡A∩αα∧∧πε}≥nF/⊂∀∞π'⊂∀∧ααα∞⊗≡↑\EWπ'!Q Jπ≤6↑.E↑ε}NnLW⊂H∀6F∂,≤7&/$∧αε≡≡"ε∞M≤vv.AQ Jπ]l⊗fN⎇lV"α∧
FO∨↓∀ε∂↔,∨⊂Jα∧∧απ6≡/⊗NvqQ hR∧∧∧v␈LTαπ&≡Bεπ≤6↑.E↑ε}NnLW∩8≥≡2π/<\Bαπ,≡FF/$∞FF∞d∧επε⎇≥g&/!≡Vv∞M≤vv.EDrε∞lAPVε≡.&∂Jt∧εO~∞↑6."∧∞&∂&↑"π&≥bαεM⊗n.n=⊗}rdtαεεM≡7α:∧
V.∞n4ε
α∞,↔:α
M↔∨α
|&V.>E`hU∞,V≡O=≥vw~D↔↔⊗∨∀αε/∞LVw'5Dε∞vD∞7'⊗≥lpNf]lw&G4↔⊗*∞>ε.≡≤m⊗."∧↔~π≡&.wMW≡O,\@hVn]V⊗/.4ε␈∩≡7&/-≡6←~D
'/∨D↔~ε≥d¬∧by∃`Lv}LRπ&≡Bπ.mLW∨~∂≥w*αLV≡f≡,Rε␈MW↔>≡<PhWMtπ&FT6}o
≥F/∩
}"απ∞↑Bε
LV≡N\≥Bπε⎇≥g"b∧∞FF/<Tεw.\,W↔~∞⎇⊗fb,Rαε≥nF/↔∞,W&.D↔_h-|7&∞EaPPh$∧α∧F↑,RεO4⊗rε←⊗oεLUBε∞NMε␈.⎇∧εv␈D
v2ε∀∞f/↔∀∞W≡.n]Bε≡≡<SPh!Q"αα∧∧ααFL\6f∂,TαF&\nεc

7≥zM≥fO&≤≡F*α$$αF≡≡"BR∃∀αF≡≡"BR∃∀αF≡≡"BR∃⊃PPH∀¬ε6O\Bε⊗≥eβ
J∀¬ε6O\Bε⊗≥eβ∩J∀¬π⊗/N↑&rπ
⎇⊗w&↑%⊂hP⊃∀αG⊗↑NW⊗r¬∞6/'∀6}&U∀ε6O\Bε⊗≥eβ≠*e∃∩JHQ!PRα∧	⊗2πM
↔~π|≡2ε≡⎇↑εNf\Dε∞vD
F}∞L\BεNnMrεf≡>αbπ≥}Rε≡}]F"πO≡ε(h!Q"αα∧∧ααα
7≥zM≥fO&≤≡F*α'n7O∨L]U}≡⎇nG⊗}Kv∩∩α.⎇ε␈&≤$"α∩$εαβα⊃Q hU≤v*βEVC0H⊃∀αααα6Bk2f⊃⊂HJ	|7&},↑"β∩Dε∪K;⊃Q `H∀∧∧≡∞MM⊗v:
∞&}?,≥W~¬}-↔'&]dεNr	}FF/$	F∞v}\⊗>/1Q hPQ$ααε≥lBεf≡>απ>}]F"π,↑εgJ∧∞vO&∧∩εw]\&/∩∞>V≡B∧↔~β6Vcββεεβαb≥f"ε=|F*α∞⎇w.fD
ε∂6QQ&⊗.]dπ≡/N∀v."∧∞Fzβ¬Dαππ,↑7.n≤-GJr∧
FF*∧.vF␈L≤"⊂N=}Vf"∞Mε.r∧&*ε≤<6/∨<\Bαπm≤∩ε∞aQ&/GL↑&v∞D↔↔⊗∨∀αG≡\Tπε∞|Tβ∩kπ∃∩ph!Q"αα	≡BεO4∧εNo
}'&∞nDπ&z
mw&*∧∞FF∂D∞FF*∧F.7
F∩ε&\=F∂⊗≡M⊗}r
≡2αεm}Bε↑m}vrα∞Mrπ&QPVNnLW↔π,↑F/∩d∧∧
εL\gεc∃\F.6≥lV"εn]f∨&≥⎇bεn∨∀ε⊗*<⊗ff\Dε↔J
≥g&/.∞&/&\DεfO>∧ε≡}LU@hV.↑Bπ&Tαπ≡}↑&≡*
|bαπMRε&\nεcλ≤LV≡f≡,↔&N⎇dεo/>Dαεv↑lW↔&]F/∨4&*α=voε≥LV"ε≥l@hVM|⊗&.D
⊗w&t∞FF*
M↔∨α]g6O-⎇fn.nDε⊗.m}&*ε≡Dε≡∞d&*π↑<V"r∧λf␈∩∞MεO~∞,V∂≡⎇eBεOD
↔_h,∀ε>}|DεN&\∀π&z
<V/αLV7εF∀w~α≥f"εL\g.r}4εNr∞<Wε∂,≡F*εm≥F/~d∧¬&FT∧ε&.n
C
?4
V∂HQ,&*π
L⊗≡.D
⊗rε≥dεNv=NV&*m⊗f*∞⎇εN≡∧∧εO~∧]⊗v≡N\F*>D'JπMRε␈MW∩εm≥F*π⎇Vrα
≡BεO1Q&≡}↑
⊗f.EDε∞vD∧εn∂∀⊗g≡t&*α=voε≥LV"π<↑ε∂⊗≡LVgJ∞⎇ε.r∧∞FF*
≥g&/.∞&/&↑$εO~∧∞Fzε,QPW/<\Bph!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hPQ!PPh!Q hT|>F}⊗↑$β∩bε↔∪;H⊃⊃∩αα∧α3"kef⊂HH∀∧ααα∧∧¬ε∞|Tβ"kFqPP`H⊃∀αα∧\≤6fO>∧¬⊗.l↑&.v<T∧n∞n\⊗`h!Q hSef"α¬∞-v'.=≥f:εl≡6f}≤L⊗⊗fTfNf↑4π>OM∧π&FT	VN&≡4∧∂∨<]V⊗f↑!PPh!Q"αα	]⊗&∂46∞r≡7≡.\-F*∧h~4bεm≥F/~∞Mε∂"<⊗rε,Tεf}≤LV"ε/∀∧dM:∧εNr∞Mε*α∞<⊗n*
\⊗vv↑!PV∂46}o
≥F/∩
}W'π↑Ebαα
MεO~
]v&*
≡2ε.nLW⊗.D∧ε↔J∞Mε*αhh∃≤b∞∞6/.MuV␈αD∧π>F≤=αεo↑>@hV≡∞ε.∂$↔"πMRε⊗\⎇⊗vv≥lrε}d∞FF*m⊗f*,V6␈,Tε∞w∀∞7&␈,≤v*π⎇}&'~aQ hR∧∧∧∞7L↑"ααhh∃≤b
↔~α,V.r∞<V.rD∧π&FT↔∨≡]\&gJ∧&.≡⎇\W~ε∀∧π'>t∧πε∂>4π⊗.M|6∂&≤-F(h,≡7≡.\-GJr∧	ε␈>↑lW∩b<W↔&≥≥bπ⊗↑>G⊗N>M⊗}w4⊗v"∧,6F∞l|W~ε|dεNwL↑'π⊗↑L↔&N⎇d"ε∂∞
GJpQ!PRα∧λvf},≥Bαπ?≥V⊗}N4ααFL\6f∂,\Bε∂4∧π/∨\≥Bαπ⎇≡FBα$∧ε␈∩∧¬d<dx(∀bJ∧↔⊗*∞W⊗n≡>6N⊗LU`hT
}v/6↑%Bπ≡≥l6*πMRε␈↑Nπ/"
≡2π&t&*εM|⊗&.D∞vO&∧f∂≡M|⊗"π↑=⊗v:λHE"?4∞7Nn-⎇Bπ&≤-F(h-≥g∨&\≤Bε}d
5$Li5Bπ&↑&*ε≡,Rπ∂]≡F*ε∀f/:M⊗66↑,Vv≡↑4εNrLW&∞≥E`hPQ$αα∧m}"π∨≥\&}g4F.6≥lV O⎇≡FFNd∞FF*>W↔⊗]nBε∂><Vn⊗O∃BαπMRε}mO∩ε.llV∨"∧
v2ε,]⊗v8Q,F.≡L≡&."λyD|∀→DεO~∞Mε∂"∞Mε*∧yIt∀D
⊗v6}-V∂&≥⎇bεO4∞ε∂∨<\Bε}d∞Fzεl≡6f}≤Dπ>F]dπ&FQQ'∨N\-vbπL≤&f*
≡2απ}-↔'&]dε∂"∞Mε*α]f"ε|dπε∂>4β∩r∧∧¬&F≡4εNr9vn⊗≥l↔&N⎇dαπ>≡Mαπ&QPW∨≥\&}g4∞7>OL=αεNdf∂≡M|⊗"εL↑F/⊗]≥f/~∞⎇ε/&↑"π&Tπ∨N\-vbε|↑G~εM|⊗&.D∧εNwMt∧$∃	|aQ\};,-{λ≥≤[→+D∧∩9H∞∨;8[mNhλ~.P74f⊂77P≤|rq7[9P;t[4∧  be loaded; if the  valqe od	αsYmbolS  is the  atomic symbol	symboLpεPA←9Yr@A≥YP∨∞cEβ←Lc!↓β⊗)β3?∞#↔⊃mαβπ;⊃∧K⊂$≥K7?e→β'M¬!1βπdaβOGn∪?3MαC3?∂∞a↓βπv!β∨3|∪π1%∧εvNfD&*εM|⊗&.E`α∧}l8RαπMRπ∨≥\&}`Q-π
α
Hl≤→1¬
βy∧w≠z∀V⊂≥42P⊂~w37i≠pz4g[⊂0yPλ:7P4]9P⊂#S'a f≠2yyP~yP⊂6≠yz∧p[2⊗⊂/d∧~¬G=kegJ0A[CW∃fA]↑↓IceI!KdA	%MMKe∃]GJ\A)QJ↓S]Ci%CXAgQCiJA]QK\A1∪' A%`
↓βf{π&X@εO_Q M≥	C"AP¬⊂⊂⊂⊃f#aS⊂9|vX7v9P≠7z⊂"→q4w2Y⊂4w⊂≤42P!]y92w≥⊂0y@3embly are also hegal, bu@PAiQKal restrictions as to where  in a storage word they may  appear and
what masking may be specified  (as compared to a normal  relocatable assembly).
Briefly, they may appear in a storage word as a full word, a right half, a left
half, or an accumulator. They may  be negated, but can not be operated	on with
any other operator.  Error printouts will be produced if they appear elsewhere.
When the symbol is encountered by fasload, DDT's symbol table is consulted.  If
it is not defined at that time, fasload will try to find a sym property  on the
atomic symbol with the same name.

   Any sort of global parameter assignment or location assignment is forbidden.
.LOP, .LVAL1, .LVAL2, etc are not available.


   The	following  pseudo-ops  are available  to  facilitate  the communication
between MIDAS  assembled programs  and LISP (particularly  with regard	to list
structure).


Page 4-48			    ∪4-6.2			 October 2, 1979
		  Calling Programs Written in Other Languages


.ENTRY function type args

	Note that the arguments to this pseudo-op are separated by  spaces, not
     commas.

	function is an atom and is taken as the name of a function beginning at
     the current location.   type should be one  of SUBR, FSUBR, or  LSUBR, and
     has the obvious interpretation.   args is a numeric-valued field  which is
     passed through to fasload and  used to construct the args property  of the
     function.	If it  is zero, no args  property is created.  Otherwise  it is
     considered to be a halfword divided into two 9-bit bytes, each of which is
     converted as follows:

	      byte	result
	      0		nil
	      777	777
	otherwise	n n-1

     These two items are then cons'ed and form the args property.

The following pseudo-ops may appear in constants.

.ATOM atom

	Followed by a LISP atom in "MIDAS" format (see below). May  only appear
     in  right half  (or entire  word)	of a  storage word.   Assembles  into a
     pointer to the atom.

.SPECIAL atom

	Similar to .ATOM  but assembles into a	pointer to the	(special) value
     cell of the specified atom.

.FUNCT atom

	Similar to  .ATOM, but invokes	special action by  fasload in  case the
     pure switch is on.  Normally used in function calls.  Briefly,  if fasload
     is going to purify  the function it is  loading, it must "snap  the links"
     first.  If .FUNCT	is used, the location  will be examined by  fasload and
     the link snapped if possible before purification.	Typical usage:




October 2, 1979			    ∪4-6.2			       Page 4-49
			   Maclisp Reference Manual



	   CALL 2,.FUNCT EQUAL	   ;calls equal As a function of 2 args
				   ; note: the CALL is not defined
				   ; or treated specially by MIDAS.
				   ; (but see .FASL DEFS below)

.ARRAY atom

	Similar to .ATOM, but assembles into a pointer to the array SAR.

.SX S-expression

	Similar to .ATOM, but handles a LISP S-expression. (See below).

.SXEVA S-expression

	Reads  S-expression.   This  S-expression  is  evaluated   (for  effect
     presumably) at fasload  time.  The resulting  value is thrown  away.  Does
     not form part of storage word.

.SXE C-expression

	Similar to .SX but the S-expression is evaluated at fasload  time.  The
     resulting valqe iq assembled into the storage word.


   The MIDAS "LISP READER"	

   By a conspiracy Between MIDAS and  fasload, a VersiOn of the LISP  reader is
available.  However, duE to Historical reasons (mostly, i.e. the fasload format
was originally	antended only  to deal with  COMPLR type  output), there  are a
number Od "glitches" (see below for list). These will probably tend to Go away
in the fullness od time.

a) numeric ATOM

   The fiRqt character of a LISP atom i@LAKqC5S]KH↓gaKG%CYYr8A∪LA%hASf↓B@FA=`	↓→`h+C#*βπS?jβ'Mβ&+∂3π⊗+⊃βSzβ∃βw+7πN→βπ≠ β↔'SF+Iβ≠Hπε."¬2Jε}$ε&F|≡FNvt¬α2Jd∧∧nNL≡0hWMVrπ∞-v≡.\N2απMtεNw∞↑Bαε∀↓f␈⊗\≥Bαεn]V/⊗≤4ε6N]LBαα∞LW⊗N≥l↔&.EDεv␈LUBαε/∀ε.OMW⊂h.>ε∞≡T∧ε␈∩=vnn∃∃bαα
MεO~∧∞f∞g\TεO~∧∞FF.d∧α↔∨M}&."$
⊗rα∞Mε*α≡ππ⊗}
&N∂LTα↔∨≤6*⊂Q%ε6O
nVjπ>⊗≡*
z"ε6M⎇g.j∞>ε∞≡U∃`hPQ("Jε}Mε/∩λ~DlO4¬ε∞g=tε↑v}⎇bε∂4
∧tXTε∂&⎇↑2ε␈$¬∧dM:¬∩¬≥→X$|e5⊃PPH*⊗>*εAS+⊃⊃∩αα∧α3"kef HH∀	v∨&|,W∩β%Dβw⊃PP`H∀∧∧≡∞MM⊗v:
∞&}?,≥W~¬}-↔'&]dεNr	}FF/$	F∞v}\⊗>/1Q hPQ$αα∧≤dπ&FTfO↔>Dαε≡≡&∞∨L↑"ε}d∞FF*∧↔&}T
↔~εm}@J~
}"α2D∧π&FT↔&}T
↔~α∀α∃∧h→T*⊂Q,↔&}Udαzε,\6}n↑4ε
π=≥f>fT6F∂,≤7&/$∞↔.␈LTε≡F≡,⊗∨&↑$ε∂~
≥b∧d~:αpMMRε∂M⎇Rεn∨∀ε⊗(Q-⊗v&\m⊗vOL]GJεM⎇f:r∧
FF*≡F}j∞⎇⊗fb,Rπ&↑-VNv≡LV"ε/∀ε∞r∞]g∂.}LV O>⊗≡*D6∂↔-≤⊗>(Q.&/'↑-bbπL≤"bᬬBαJD
w⊂O<]VN≡⎇Mvrr∧
Vw∂]}F."
M⊗v.l\V'_≤≡&*ε≤⎇f␈⊗\Dε∞vD∧ε&z
mw h,,V≡}\Tπε∂.Dε}2∞Mε*ε≡Mvjr∧
FF*∧6F∂,≤7&/$∞FF∂D∞F/⊗]≥f∂&↑4π&FT↔&}T
↔~α∧.W≡.D∞Wα⊂Q.Vvf↑>2εOD
↔~ε∀¬αε␈$¬∩pLm}F*α∞Mε∂"∞W⊗N|DεO~∀εf.|≥Bε≡⎇n7&ON\Vw"
|bε
∧↔&}T⊗v Q,F}/4
f␈"∞LW⊗n≥l↔&*
≡Bε␈$⊗∨"∞>ε.≡≤≥FgJaQ hV5∀εfO>N0hPQ$αα∧M≡7'~∞⎇w⊗Z
mw⊗n≥MGJb.W"εm}F*εm⎇Ff␈⎇≥f:ε<≡W&N⎇dπ⊗.L≡FO6T∞FzεM}Bεv}L↔&N⎇g"ααaQ&&}↑4εv␈D∞F/⊗]≥f∂&T↔&}↑5bα¬M∞W~b∞Mrαε≥nf}↑TF␈"
mw&∂M≥vrb∞Mε*εM}Bεo↑>@N⊗T
F.7AQ&&.M≥VO&\Dε↔J∀π∨ε≤<RbπL≤"bπ≡&.wMW≡O5Dε␈∩
zFF/$6F∂,≤7&/$
FF∂D∧ε&}↑4π&/-]⊗v∂LQPV∂M⎇W~pQ!PT>M≡F≡F↑7 hPQ$αβ
∀∧¬⊗/>N&N∨M≥vrε⎇dαπε≡8d∧→→<]Y→;ND≠~<nDλ≤⎇∞.8⎇≥.,(λ%T∩;H∧;↑(∧
~<⎇∧∞Y89
≥Yc"D∧λλλ
}→<X.M;{K∧
[h≠L↑h_=
⎇<h≠M}λ≤≤L↑Z;⎇.=≡(→-l{⎇;NL<Y9∧
8>(,"9;L=⎇;]↑Y9λm|C"D∧λλλ∞M→(→M≡\⎇α.M;9(
⎇Hλ≤≡|hEd∩≠⎇l↑Y<K∧∧≥~~.4≤Y<nNZ8⎇
≥{HλMy<h
m⎇λλ≡≤≠≡$∞≠c"D∧λλλ≡≠{+-⎇[≡(∞,89~-lh≠|↑X=~-⎇\h
¬h5∪s%DTtλXr+λ¬hU3PjD→=_e∃C"C!$λJ$
z;YmL(≤=-}→(→M}H≤=-}~;Yd∧→≠y.4≠[⎇∧>~<nD
≠[d
⎇~→.$≠88n-hλ_m<X8nL<\h←~<⎇↓QHλλ∧∧→:=
<KJ!QC"H∧εj(∪N]8Y<N4≠=<nD_Y(m_9yl\λ_<d8[⎇LT_;≥l∨<kC!!"B(∧∧λλ∪)zQ2(λ∃P5	y(,F1(λλ∧∧∞s∪j84h$z=Y.4≤≠z-n→<C!!"""$∧λλλπ4≥≠h
	P31$∞≡<→$=≠{!QB""!∀λλλ∧πh≥z.Mλ∀∪H→1(&&kH~.D~<c!!"""$∧λλλπ4≠[⎇∧
];9.-8kC!$λλλ∧∞<y.AQB(λ∧∧λ∪3jh2(⊂%EP5∪iTλl,F4λλλ∧∧∞⎇z-nc"C!$λ
$	[hλ∞∞[⎇Z.=;{H←~<⎇∞4λ≥≠d∞rence "GLOBALSYMS"  in fasload.   This mostly
     means only that DDT must be  present to load a MIDAS assembled  FASL file.
     (Some simple COMPLR and LAP  FASL files can successfully be  fasloaded by,
     for example, a disowned LISP running without a DDT.)

  5) LOC is illegal in a FASL assembly.  BLOCK of a non-relocatable quantity is
     ok.



October 2, 1979			    ∪4-6.2			       Page 4-51
			   Maclisp Reference Manual
α

  6) Currently(  symbol loading  is very  slow.  Thus  use (symbols  nil), (the
     initial state) unless symbols are necessary*

  7( Midas doeq not know about any LISP symbols op∧A+=bAga∃GSCY1rT@@↓3←jAMQ←kY⊂~∀@@@A@]%→'%(↓'3&t9
β'_%	
&≤\∪)Q%fAMS1J@AG=]iCS9bAIK→S]Si%←]fA=H@Age[E←YLAM←d4∀@@@ACIX↓→∪' ↓CGGk5kYCI=efAC9H∪++=bP@]≥→∨¬β0AIKFαcπKπ&K?;Mε3?Hπ∞c1α≡dz∀J;∀m~AQ"αα∧∧ε∞vDF.6≥m↔&N⎇n2ε6} π∞}\TεNwL↑&v∞A→DM≥∧
V∞∨-}2π∨\9αε∂4	D|≤9∀αε∞βY
YS∪pi9+C"D∧λλλ
M~<hM;→(
≡h→⎇,≡X;]\9λ∃
t_Y(∞↑λ≥≠d_=→$∞z;XlT≥~→$<|q-\[~(
|H∪∩*:λ~=∞≤;→C!$λλλ∧∞8q0→H4z↔εB∧¬
  8)  .ATOM "should"AEJA∧@Agaα+∂'πb↓β∂π≤∧Rαε|dαu≥∧∧αrα	
w>/lXEDλ~=∧∧~<h
9Y≠\β"H∧∧λλ∀l↑_8X.L9≡(,8x=.<(≠p∪λ:42P→5v6']tw#@ "reasons":
     a) The previ@=kgYr↓]←iK⊂AeKgQ`'∂&K?9βx¬bπε≡0d→<⊃-l→;]∧	∩4u
5C"H∧∧λλ_E∀⊃:1≡h_p-d→≠h={\⎇≥]≤h
}≥~;-∨X=~-⎇H≠p↔λ0z7f\P0pλ→py4w→P4w_ww9z_w:9P
5wεEαq3r4λ80y@3 one and pass two)  bqt @9←hA←8A→∪'Q&\A	!KeKM=aJXA∃CGP∪1SghA%b~∀∪≥kCeC9iKKH↓iVAi¬WJAB↓cCaCICiJA]←eHA%\AiQ∀AG←]MiC@;'→βπK.	β↔[,qβ'→αβ'QβO_4('N#↔;SN≠π1β&yβO?n)β?SF+Iβ3O≠Qβ←FK∂!β∞cO=β∂βC↔π↔→β'9ε	β∂?w≠Sπ≠"p4)↓α↓↓β
Jα↔π∂Bβ3'O"βSπ∂/→βπ9ε∪∪'&K?;πbβ↔;S↔Iβ'9ε3πO3}⊃∨Mα∪πS?j⊃βSπ⊗c∃8&&C'MβO_4(≤∀πε.↑
wε∂/∀π&∞-LRπ&≡BεO4fG∂=V"ε≤nF/∩∞Mε*εl≡6f}≤M⊗v:
≡2ε≡⎇↑εf/LUbα∧|aPPN=}W↔≡UDαe≥∧∞7&NMDπ>␈->2αεmxD=≠{.4≠;q∞]≠h≥
(_8M}Y(λ
m⎇→9∧∞Y<u∞4qz4[w9FEαpw2 inefFicencies.



¬

	


α¬


α

α¬




α¬




Page 4-∃2			    ∪4-6.2			 October 2, 1979
			    Maclisp Refepenc@∀A≠C]UCX∩∩$@@@@@@~∀4⊂∩∧h8j@A∪9iKe]¬XA∪[AYKK9iCIS=\A	KQCSIF4∀~∀~(@@A)!SfAg∃GiS←8AIKg
aSEKL@AiQ∀AS]i∃eECX↓[CGQ%]J[Y∃mKX@↓IKiC%YfA←_AiQJAmCe%←kf~)S[aY∃[C]i¬iS←]L\@Aβ8Ak]I∃egiC9IS]N↓←LAi!SfA[¬iKeS¬XASf↓]←hA9KGKgMCerA%\@A←IIKd~)i↑AkMJAYSM`XAEUhAShASfA!KYaMUXAS\↓oeSi%]NA→¬ ∪G←⊃JAC]⊂AS\AU]IKeMiCMI%]N@AQQJ~∃=kiakPA←LAQQJAG=[aSY∃d\~∀4∀~∀h8n\b@↓)QJAAI`Zb@A∪[a1K[K]QCiS←8~∀~∀4∀~∀h8n\d@↓π←]m∃]iS←9fAM←HA
k]
iS←]LAS\A1Sg`~(~∀~∀@A)Q%fAgK
iS←\↓EeSK→YrAI∃gGeS	KfAg=[J∪←_AiQJ↓S]iKI]CXA
←]mK9iS←]LA←L∪AI`Zb@~∃YSM`XAC9HAG←9iCS]LAK]←UOP@A%]M←e5CiS←8AM←d↓BAaKIg←\@↓oQ↑A-]←of↓aI`ZD`@A[¬GQS]∀~∃YC9OkCO∀Ai↑@↓k]IKIgiC]⊂AiQJA←kiAkhA←_∪iQJ↓G←[a%YKdXAC]H↓a←gg%EYr@↓i↑@A]eSiJ4∃gS[AYJAY¬`AMk9GiS←9fAM←HAkgJ↓oSiP↓YSg`8@A⊃←]KmKd0AiQJ↓S]M←I[CiS=\AoSQQS\@↓iQSf4∃gKGQS←\A%fAgk	UKGh↓i↑AG!C]OJ8@A/Q∃]KmKH@AC]dAY←G¬iS←\↓oSiQ%\AYSM`ASfAeKM∃eeKH4∃i↑AMs[E←1SGCY1rAS\↓iQSf↓gKGi%←\XAQQChAMs[E←0@ASf↓aeKI∃MS]K⊂Ai↑A1C`AC9HA[Cd@AEJ4∃kgK⊂AErA¬]rAY¬`Aae=OeCZ↓KmK\↓SLA	⊃(AI←∃fA]←PAQCm∀AYSg@OfAge[E←YLAY←C⊃KH\~(~∀@@↓)QJA9C[Kf↓←LAi!JACG
k[kY¬i←ef↓C]HAQQKSd↓kgKf↓CeJX↓EeSK→Yrt~(~∀@@`A]S0@@@@ACi←4AQKC⊃KdA←_AiQJ↓Ci←[%FAgs5E←XA9SX~∀@@bA∧∩@@@@AMSIghACIOk[K9hAi↑↓BAMk9GiS←8vAmC1kJA←_AMk]
iS←\4∀@@@HA∧∩@@@@AMKG←]⊂ACeOU[K]h4∀@@@LAε∩@@@@AQQSeH↓CeOk5K]h~(@@@h↓β$b@@@@A→←kei ACeOU[K]h4∀@@@TAβ$e∧@@@@↓MSMi ACeOU[K]h4∀@@@XA(∩@@@@A9KOCi%mJA←_AiQJ↓]k[E∃dA←L↓CeOf↓i↑AC8AYgk	dvAi∃[`~∀@@nAQ(@@@@@AgUaKd[QK[a←ICerv↓mCYk∀AMe←4A]k[∃eSFA→k]Gi%←\~∀@b`A⊂∩@@@@AgK5R[iK5a←eCIrvACISiQ[∃iSF~(@@bb↓$∩@@@@Ag∃[R[i∃[a←e¬ervA¬eSiQ5KiSF4∀@@bHA∩@@@@AMK[R[QK[a←ICerv↓CeSi![KiS~∀@@DfA
%∃βε@Ak]kMKHXA∃qGKaPAgCm∃H←kg∃H←eKMi←eK⊂AErA≥F~∀@bhA $@@@@AeKOUYCdAAkgQI=o\AY%gh@QAIXRAA←S]i∃d~∀@bjA
1 @@@@AMY=]kZAAIXAa=S]iKH~∀@@DlA
1@@@@@AMSq9kZAa⊃XAa←%]iKd4∀@@b\A' @@@@@↓gaKG%CX@QYCeSC	YJAE%]IS]≥fRAa⊃XAa←%]iKd4∀~∀~)!COJ@hZjL∩∩∩@@@@&DhZ\n$∩∩@@↓≠CeG @lX@Drnr~(_∩∩∩$∩∩∩∩$@@@@@@~∀4∀~∀@A∪\A≥K]Ke¬XX∪&5Kqae∃ggS←9f@Ag!←kYHAEJA5C]SaUYCiK⊂@AS\AiQJ%MSmJACeOU[K]h4∃CGGU[kYCQ←efv↓iQJA
←]iK9ifA←_@AiQ∃gJACIJAae=iKGi∃H@AEdAiQJ↓OCeE¬OJ@A
←YYK
i←d\4∃%C]⊃←ZACISiQ[∃iSFAMQ←kY⊂A]←h↓EJAI=]JAS8AiQK4vAiQ%fA[S≥QhAC
GSIK9iCYYdAOK]∃eCiJ4∃iQJ↓CIIe∃gfA←_Ag←[∃iQS]≤AiQJ↓OCeE¬OJAG=YYKGQ←dAg!←kYH↓]←hAAe←iK
h\@@↓βeOk5K]if4∃i↑AMkEefACeJ↓aCgg∃H@Ai!e←kO AiQKMJ@AM%mJ@A¬GGk[UYCi←IfXAC9H@Ai!JAmC1kJ@A=L@AB4∃Mk]
iS←\↓SfAe∃ike]∃H@AS8ACGGU[kYCQ←dAα8@@A)!JAgS9OYJA¬eOk[∃]h@AQ↑AC\↓MgkEH@ASf4∃YSW∃oSgJ↓aCgg∃HAiQI←kOP↓CGGk5kYCi=dAα\4∀~∀@A∪hA%fAOK9KeCY1rACgMk[KH↓iQCh↓oQK\↓C\ACIOk[K9hASf↓aCgg∃HA←d↓BAmC1kJAe∃ike]∃H~∃i!e←kO AiQKMJAMSYJACG
k[kY¬i←efAiQCPAiQCPAiQJ↓YKMhAQCY_AoSY0AEJAiKe↑XAoQS1J~∃i!JAeS≥QhAQ¬YLAo%YXAG=]iCS8AB@AA←S]i∃dAi↑↓C\A&5Kqae∃ggS←8\@A≠UGPAG=IJ@A⊃KaK]⊃f~∃←8AiQJ↓YKMh↓QCYL↓EKS]≤AuKe<vAS\AaCeQSGkY¬dXAi∃gifA→←dA]%X@Qo!SGPA%fAiQ∀@AuKI↑~∃a=S]iKHRAkg∀A∃+≠A
AS]MiekGQS←]f0AoQS
PAeKEkSeJ%iQCh↓iQJA1KMhA!CYLA	JAuKI↑@Ag<~∃iQ¬hAiQ∀AiKgPA←LAQQJAe%OQhA!CYLA]SYXA	JAmC1SH\∪%\AOK9KeCX0AiQK8XAS]MiekGQS←]f4∃YSW∀A⊃%%hAC]H↓⊃→%4↓gQ←k1HAEJ↓kgKH↓i↑AM∃iGPA%iK[f↓S]i↑↓iQKg∀ACGGU[kYCQ←ef\4∀~∀@A&[KaaeKgMS←]f↓CeJAIKaeKMK]iK⊂AS\AMkGPA∧AoCR%iQCh↓SLAB↓a←S]QKdAi<AB∪I=iiKH4∃aCSHASfA%\XAg¬rXAC
Gk[k1Ci←d↓αXAi!K\~∀4∀∩∩∩$@@Q⊃1%4A∧`AαR4∀~∃o%YXAO∃hXACLABAa=S]iKHXAiQ∀AGCd↓←LAi!JA&[∃qaeKMgSO\↓C]HAAkhASPAS\@↓CGGk5kYCi=d∩∃∧0AC]H4∀~∧∩$∩∩@@!⊃%%4↓∧@`A∧R~∀~)oSYX↓OChAQQJAGα#I9↓∧K→↓β&C∃αMn+cCK/≠O'?rβ←#?≡)βπ∪'∪↔OMεKE↓βLqα¬βI→β¬β6Kc+Wh↓β?HhS≠&⎇nVjb∞Mε.pQ!PPH⊃⊃∩αDYzd*¬JDβα∧∃⊃PPh.⎇⊗fB|W"πMRεn≤=εNvT∧π⊗/∞,W∞.nL↔&Nut it in  accumulator
TT.

   Accumulators T through  F may  be used  as scratch  registers, in  general.
When an lsubr is called, however, the  negative of the number of arguments  is
passed in accumulator  T.  Many  useful internal  routines are	called by  JSP
T,FOO, and the argument or value is commonly passed in TT.  Functions compiled
by the fast- arithmetic compiler return their  values in TT.  TT is also  used
in coNnection with array accessing.

   FREEAC is  presantly unused	by the	lisp system,  except for  the  garbage
collector, which, however,  saves and restores	it.  This fact	should not  be
taken


March 6, 1979			    ∪14-.7.2			      Page  4-54
			    Maclisp Reference Manual			       


as permanent; it is mentioned primarily because it can be useful for debugging
purposes.  One day soon  this accumulator will	be renamed BAR	and used as  a
base address register for relocatable binary programs.

   The pdp-10 lisp system  uses four pushdown lists,  or stacks.  The  regular
and special pdls,  whose pointers  are in  P and SP,  are marked  from by  the
garbage collector; thus an S-expression is "safe" from gc if pushed on	either
of these pdls.	(Only the right half of each pdl slot is marked from; the left
half may contain garbage.)  The special pdl is used to hold variable bindings,
and its contents  are highly structured.   The user should  not use SP	except
through the routines SPECBIND and UNBIND, described below.  P may be used  for
any purpose, provided that  totally random things are  not put into the  right
halves of pdl slots (the same restriction as for argument accumulators).   The
fixnum and  flonum  pdls (pointers  in	FXP and  FLP)  are used  primarily  by
compiled code produced by the fast-arithmetic compiler, and their contents are
not affected by gc in any way.	If it is desired to save random quantities  on
a stack, the fixnum pdl should be used if possible.

   The standard  function  calling convention  in  pdp-10 lisp	requires  that
functions be effectively called  via a (PUSHJ P  function) and exit via  (POPJ
P).  The arguments to  subrs and fsubrs are  as described above.  Lsubrs  take
their arguments on the regular	pdl (where they are safe  from gc), and T  has
minus the number of arguments.	The return  address is also on the pdl,  under
the arguments.	This usually requires code of this sort:

		  (PUSH P (% 0 0 G0475))
		  (PUSH P A)
		  (PUSH P '(funny list))
		  (MOVNI T 2)
		  (JRST 0 FOO-LSUBR)
	  G0475   --- lsubr returns to here ---

That is,  the  return  address must  be  pushed  ahead of  time.   It  is  the
responsibility of the called  lsubr to remove its  arguments from the pdl  and
return with a POPJ.

   Interfacing between compiled code and the interpreter is accomplished via a
large set of  UUO instructions.  All  of them  work in the  same fashion:  the
effective address must be the address of an S-expression which is the function
to be  invoked.  The  arguments to  this  function are	passed in  the	manner
described above, and  the accumulator field  describes which argument  passing
convention has been used (hopefully the same as that required by the called


Page  4-55			    ∪14-.7.2			   March 6, 1979
									       


function): 0-5 means a	call to a  subr with that many	arguments, 16 means  a
call to an lsubr,  and 17 means a  call to an fsubr.   Thus the function  CONS
might be called with the UUO (CALL 2 (FUNCTION CONS)).

   There are several variants on this basic UUO type.  One variant is the JRST
vs. PUSHJ Mode; sometimes instead of writing  a PUSHJ to a function one  wants
to write a JRST for efficiency.  To see why, consider that

		  (PUSHJ P FOO)
		  (POPJ P)

is in effect equivalent to

		  (JRST 0 FOO).

This kiNd of UUO is also useful For cAlling lsubrs (see the example above).¬

   A secOnd variant  is the  "clobberable" Vs.	the  "unclobberable" UUO.   If
certain cOnditions are met, it is possible for the UUO handler to replace  the
invoking UUO by the equivalent PUSHJ or JRST, so that next time the same  code
is used it will call the  desired function directly.  In some cases,  however,
it is  not desirable  for the  UUO  to be  so clobbered,  for example  if  the
fqncTion to be invoKed iS an argument in an accumulator, and is to be  invoked
via something like  (CALL 1 0  A).  A UUO  may therefore specify  that it  may
never be clkbbered.

   A third option is  usedby code cOmpiled  by the fast arithmetic  co@5aSYKH\~∃∪PASfAU]IKg%aCEY∀AM←d↓BAMk9GiS←8AoQS
PAeKQke]f↓BA]k5EKdAQ↑AI↑↓B@E]U[EKdAG←]LD~∃S8A←eI∃dAi↑↓eKikI\AiQ∀∪]k[	KdAβLAC\AL[KqaIKggS=\ASLAiQJ↓]k[E∃`AoS1XA←]1r@AE∀~∃G←9mKei∃HAEC
VAi↑ABA[¬GQS]∀A]k[	Kd@A¬]HAkMKHAS8@A[←IJA←a∃\[G←⊃KH@A¬eSiQ5KiSF8~∀Q∪PASfAU]IKg%eCEY∀AEKG¬kgJA9k[EKH@AG←9gSMN0AYSW∀A←eI%]Cer↓G←]g%]NX@↓KmK]QkCYYd~∃GCUgKfA≥CeEC≥JAG←1YKGi%←\XA¬\AKqAK]gSYJAae=GKgf8RA)QUfABAU+≡A[¬rAga∃GSMrAiQCP~∃Sh↓oC]iL@A←]1rAB@↓[CGQ%]J@A9k[EKHACf@↓B@Ae∃gkYhlAiQSL@ASfAi↑A	J@Ae∃i`↔Kv+⊃↓βLp4+π≡≠W7WdS/I¬"Q1β⊗S#↔∩βS#πpβ¬β3O≠Aβ;.k↔I∧¬⊗r∧∃aPPH$∧α¬&Tεnv]]vvN>4ε6|H⊂⊂[4⊂:4→yrP*UgyP0\2P9z[vpy4↑2r⊂4→y2]εBεE∧DBP1f /bberable	     uncloBberable
			 @!U'⊃∀∩@A∃%M(@@@@A!M⊃∀@@@A∃%M(~∧@@@@AMiCMI¬eHAe∃gkYh$Aπβ→0∩@@A)πβ→_@@@A
β→	@@@A)πβ→→_~∀@@@@A]U[KeSAeKgUYh∩A9πβ→_$@@A≥)ββ→_@@A≥
β→	@@A≥)ββ→4∀~∀@A)QkLAiQJ↓KqC[AYJA←_AC\A1ckEd↓GCYX↓CE←m∀Ao←k1HACGQkCYYdAEJA]aSii∃\t~∀4∀~∃≠, 1979			    ∪14-.7.2			      Page  4-56
			    Maclisp Reference Manual			       



		  (PUSH P (% 0 0 G0475))
		  (PUSH P A)
		  (PUSH P '(FUNNY LIST))
		  (MOVNI T 2)
		  (JCALL 16 (FUNCTION FOO-LSUBR))
	  G0475

   Functions produced by the fast  arithmetic compiler follow a convention  so
that NCALLs will work properly: If a function is to be NCALL'ed, and returns a
fixnum, the first instruction of the function should be (PUSH P (% 0 0 FIX1));
if it  returns a  flonum, the  first  instruction should  be (PUSH  P (%  0  0
FLOAT1)).  (For a description of the FIX1 and FLOAT1 routines, see below.)  If
the function is NCALL'ed, the function	is entered at the second  instruction,
i.e.   after  the  PUSH.   The	appropriate  machine  number  is  returned  in
accumulator TT,  as  expected by  the  caller.	If,  on  the other  hand,  the
function is simply CALL'ed, then it is entered at the normal entry point,  and
the address of FIX1 or FLOAT1 goes on the stack.  When the function exits,  it
will transfer to FIX1 or  FLOAT1, which will convert  the machine number to  a
lisp number and then return to the original caller.

   Some other UUO's  besides the CALL  UUO's are useful  to compiled code  and
hand- coded lap.  The STRT (STRing  Typeout) UUO is quite useful for  printing
out constant strings  of characters.  The  effective address of  the STRT  UUO
must be the first of several  words of sixbit characters.  Several  characters
in the	string have  special significancE8  ↑ Complement  the 100  bit of  the
character Before printing it.  (This occurs
     after 40 has been added to convert it to ascii.)  Thus ↑M in the sixbit
     string causeS a carriage returf to be printed.  SimiLarly, ↑4 iq a lower
     casE t.
!   Terminate typeout.
#   Quote the nexp character.  This is used to get #, ↑, and ! into a string.

   Thus, For eXamplE, to print the  messace "YOU LOSE!" in lap cOde,  preceded
and followed by a Carriage returf, qay

		     (STRT 0 (CIXBIT ,π=≠3=*↑A→='
F↑∧←=~↑∧RR~∀4∀Q)Q∀AgYCMQKfA¬eJA]∃GKgg¬erAE∃GCkg∀AYC@↓oSYX↓eKCH↓iQSf↓kgS]≤AiQJ↓YSg`↓eKCI∃dBR~(~∀@@↓)QJA1%$@!→Sg`A%%=dRA+U≡AiC-Kf@A∧Agie%]N@A1SWJAQQJA←9Kf@AM)%(AQCWKf0@AC]⊂~∃gS≥]CYf↓C\Ak9G←ee∃GiCE1JAKeI←dXA]SiPAQQJAgQeS]N↓CfAi!JAKeI←dA[∃ggCO∀\@A¬∃GCkg∀~∀
∀4∃!CO∀@@hZTn∩α∩@@@&DhZ\n8d∩∩∩@A≠CIGP@l0@brnd~∀_∩∩∩$∩∩∩∩$@@@@@@~∀4∀~∃i!JAKeI←dASL@Ak]
←eeK
iCEY∀XAG←9ie←X↓]KmKH@AeKQke]f↓i↑AC→iKd@↓iQJA1%$v↓Sh@A%b~∃Y%WJAB↓∃%'(↓iVAi!JAKeI←dAQ¬]IYKHX~∀~(@@A)!JA→Hf@A+U≡@ASL@AgS5SYCd↓i↑@A1%$XAEkhACYG<AiCW∃f@AC8@A&[∃qaeKMgS←\AS\~)CGGk5kYCi=dAαv%iQSfAKqaIKggS=\@Ag!←kYHAEJ@↓MWYY=oKH∪	r@Ai!J@AgQaS]NAoQS
P~∃G=]giSQkiJAQQJAKIe←dA5KggC≥J\~∀4∀@@AQQJAI∪≥(AU+≡ASLAkgK⊂Ai↑AMSO]C0AG←eIKGiC	YJAKIe←ef8∪∪hAQ←↑Ai¬WKfA∧∪gie%]N~∃¬eOk[∃]hAC9HAC\A&[KaaeKgMS←\A%\Aα\@A)Q∀ACGGU[kYCQ←dAM%KYH@↓←LAi!JA%%≥(@AU+≡~∃%]ISG¬iKfAQQJAieaJA←_AKee=dt~∀4∀∩@@@`∩@↓k]IK_[M]GQ\~∀∩@@@b$@Ak]	]H[mIEX~∀$@@@@H∩@AoI]N[ieaJ[CIN~∀∩@@@f$@Ak]MKK\[≥↑[iC≤~∀%α↓↓↓PJ↓β←Kv97;=nK∨LhP%↓↓α↓T%↓ε;
73␈≠Oπ∨*↓#?,M⊗v∂-≥GJπ↑<V"ε⎇mGJε)∀ε>~⊃Q Jα∧∧β0J∧f∞NE\⊗∨ Q!∩αα∧εpJα
→rnf}>6∞>QQ hR∧∧¬&FT
2n/∞∞&/∨=≥vrε,\6}n↑4π&FT∧ε∂⊗}YV.wDλ

t≥~→$∧→<\M}H~;NL<X].∞λ~_-l≠→<D∧→[p→βE:42H3t{2[⊂:<x→Dws⊂→y97yλ⊂∀4wλ:42Pλ1pybH7s⊂⊂≥<x2yH_⊂⊂:≠P→V⊂λ:42P→y97yλ⊂40w→62yεB0zz7[pz4qXv6<P_x864YyP:4→P3:w_z4wwλ71ww≤P:7Pλ:44yH7q52Xz⊂12Y7y2P≤0yyt[3P4zλ⊂0yFB:42P_y3zfYw:∀Wαds⊂:~2P40[262yλ92z:\79P0H⊂1wy≤2qz2Y⊂;0v≥rP∀2K3W⊂:~2P:yYy⊂4wλ⊂0FE≤z0w2_y2⊂2\97y⊂_92puH:yrrλ:42P≤2z:y≠⊂⊂3:[1z4w[∀P:4→w⊂:4~yP72]P;0v≥rP4yBx0yyYrεE1_quP4[⊂ P0[2⊂1w[:97vλ92z:\79P:≠P:42H4w9z≤:qz4[w⊂0s≥2y⊂*~2P"i∩g*↔εBεE⊂⊂λ P:<\4qpvλ84rqYP7s⊂≠0x⊂1[r2P:≠P:yrH:44yH6tst≥⊂12]βEαE∧H⊂∀& T⊂#'gH)ja)
FE∧DH⊂∀(*Td⊂(⊂⊂TFE∧H⊂*"iU∧P⊂∀∩)h⊂*λ#,'+∀P⊂⊂λ⊂⊂≥sYz⊂7:[ry4qH;0v:YP4w⊂→εE∧DH⊂∀*)∪"P"⊂TDP⊂λ⊂⊂≥{Xw:⊂ H6zv:~x62P≠s⊂~εB∧DP⊂
%))jλ_⊂&'TbTFEαDP⊂↔λ↔⊂↔εB∧DP⊂
('h%λ(∀FEαP⊂&'TbDP⊂
"l!dλ P!∀BP⊂⊂⊂λ≥srzλ10r⊂_y3P$[⊂0FEαDP⊂∀⊃i$g*λ→⊂∀∩H)dl!∩h⊂''U⊂ P&Uf*$h∪"P'cλ~∀TFB∧DP⊂
"h!dλ P!∀BP⊂⊂⊂λ≥y{t]1t⊂1_quP0YptwεB∧DP⊂
%))jλ_⊂*"Tj∀P⊂λ⊂⊂⊂≥YwP:9≡P0spZwεE∧H⊂'$fβEαEεBεA&p\1t⊂≠⊂_\[ND@DPλ⊂⊂	XM⊗W≠G∧@DPλ⊂⊂⊂⊂∀0srPλ~⊗Z\βEβ∧DDPλ⊂⊂&pXv4yxλ)2s"\2w1`% Manual			       

	α   UUO's never change the valueS in  any AccumulatorpεAKq
KahA∃%∪≥(0AoQS
P@A[¬r~∃e∃ice\↓B@A]∃nAmC1kB@A%\@Aα0AC]HAiQJ↓mCeS=kf@A
β→_@↓++≡OLXAoQ%GP@A5Cr@A
Y←EE∃d~∃KYKesi!S]NA%LAiQ∃r@AQ¬mJAi<AS]m=WJ@A∃mCXAQ↑AYS9V@Ai<AC\A%]iKeAeKiK⊂@AMk9GiS←8\~∃π¬→_A+U≡OfAMCmJA¬YXAC
Gk[k1Ci←eLAoQK8@AYS9WS]N↓Me←Z↓←]JA
←[aS1KHA←H@AQC9IG←I∃H~∃MU]GiS=\Ai↑↓C]←i!Kd\@↓)QSf↓S[aY%KfAi!ChAi!JAGC1YKHA→k]Gi%←\Ao%YXAO∃h@Ao!CiKm∃d~∃o¬fAaY¬GKHA%\ACG
k[kY¬i←ef↓(AiQI←kOP↓ACf↓oKYX↓CfAα↓iQe←UOPAβHeα\@↓∪hAI=KfA]=h~∃S5aYrX↓Q←oKYKdXAQQChA¬]rAC
Gk[k1Ci←eLAoSY0AQCm∀AEKK8AaeKMKemK⊂AErAQQJAi%[JAi!J~∃G¬YYKH↓Mk]GQS←\A!CfAe∃ike]∃HAi↑↓iQJA
CYYKH\~∀~(~∀h\\\f@A%]iKe9CXA%=kiS]∃fAM←HAkgJ↓ErA→¬ Aπ←⊃J~∀~(~∀@@↓π←[a%YKHA
←IJAIKckSIKfABAGKeQCS\AMKhA←_AgkaA←eh@↓e←ki%]Kf\%)QJA9C[KfAC]H4∃CIIIKggKLA←LAQQKgJ↓e←ki%]KfA¬eJAaIKIKM%]KH@↓i↑AY¬`\@A%hAgQ=kYHA9←hAE∀@ACgMk[KH4∃iQCPAB∪O%mK\@↓e←ki%]J∪g¬mKf@↓C]r@↓CGGk5kYCi=ef@AU]YKgL@AShASf@↓gaKG%MSGC1Yr~∃⊃KgGe%EKHA¬fAI←%]NAg<X∪)Q∃rACe∀AEeS∃MYrA⊃KgGe%EKHA!KeJt4∀~∀Q)' A(↓'!π	∪≥λR4∀@@@A)QSLAe←kQS]JA!C]IY∃bAiQ∀AES]⊃S]NA=LAga∃GSCX↓mCeS¬EYKf8@A)Q∀AGCY0ASf~(@@@@↓M←YY=oKHA	rA←]∀A←dA5←eJAMaKGS→SGCi%←]fA=LAiQ∀AM←e4@QisAJAoQ∃eJ@QMaKGS¬X~∀@@@ACQ←ZRR0AoQKIJAisAJASf↓KSiQ∃d@o>PbA←d`\@AQQJAm¬YkJA=HAiQ∀ACi←5SFAge[E←X4∀@@@ACi←4XAoQ%GPASLAS\AQQJAo=eHAa=S]iK⊂Ai↑A	rAiQ∀AKMM∃GiSm∀ACIIIKgfA=LAiQ∀~∀@@@ACe≥k[K]PXASf↓gCmK⊂A←\AQQJAgAKGSC0AaIX0AC]H↓BA]K\AmCYUJASf↓aYCG∃HAS\↓iQJ~(@@@@↓mCYk∀AGKY0XACf↓gaKG%MSKH↓ErAieaJAC9HAoQ∃eJ\@↓∪LAE=iPAieaJAC9HAoQ∃eJACIJ~∀@@@Au∃e↑XAQQJA]ue is nil.  If ype is zero, then where is the number  of
     an accumulator containing the  new value.	If type is 7←41,  then the  new
     value is in the regular pdl slot addressed by subtracting where from  the
     current  contents of  accumulator	P; where  may be  any number less than
     2000 octal.  (This is a case where not truncating	the  accumulator field
     of  a  lap  instruction  to four  bits is	very  useful.)	Any  number of
     specifications may  follow the  call to  SPECBIND; the end of the call is
     determined by the fact that a valid pdp-10 instruction within lisp cannot
     be zero in the first nine bits or ones in the first three. All the values
     pushed in	a single call form a single bind block;  this fact is  used by
     the  UNBIND routine.  SPECBIND destroys the contents of accumulator R.


(JSP T (SPECBIND -1))
     This is an alternate entry to  SPECBIND, which has the additional	effect
     of  passing  all  new values  through  the  routine  PDLNMK  (see	below)
     before  placing them  in the value cells.	It is used by code compiled by
     the fast-arithmetic compiler.  [[[ HAS THIS VANISHED OR SOEMTHING? ]]]

Page  4-59			    ∪14-.7.2			   March 6, 1979
									       


(PUSHJ P UNBIND)
     Pops one bind block off the special pdl, thus restoring the old values of
     the atoms whose values were formerly saved.  Example: the following lisp
     code and lap code are roughly equivalent:

	     ((LAMBDA (SPECVAR) (ZORCH)) 'BARF)
		    (MOVEI B (QUOTE BARF))
		    (JSP T SPECBIND)
		    (0 B (SPECIAL SPECVAR))
		    (CALL 0 (FUNCTION ZORCH))
		    (PUSHJ P UNBIND)

     UNBIND does not destroy any accumulators.


(JSP T PDLNMK)
     "Pdl number make".  This routine examines the S-expression in accumulator
     A, and if it is a pdl number it replaces it with a freshly number-consed
     copy.  Used by code produced by the fast-arithmetic compiler.  Does not
     destroy any other accumulators, even TT.


(JRST 0 PDLNKJ)
     Equivalent to

		    (JSP T PDLNMK)
		    (POPJ P)


(JSP T FXCONS)
     Takes a machine fixnum in accumulator TT and returns an equivalent S-
     expression number in accumulator  A.  The value in  TT is not  preserved.
     No other accumulators are disturbed.   Another name for FXCONS is	FIX1A;
     they are entirely equivalent.  Note that lisp fixnums are represented in
     such a  way that the address  in A will point  to a word  containing what
     was in TT.


(JSP T FLCONS)
     Similar to FXCONS, but takes a floating-point machine number in TT, and
     returns a lisp flonum in A.




March 6, 1979			    ∪14-.7.3			      Page  4-60
			    Maclisp Reference Manual			       


(JSP T FXNV1)
     Verifies that the	S-expression in accumulator  A is a  fixnum; if it  is
     not, a correctable wrng-type-arg error is signaled.  If it does contain a
     fixnum, or  if the  error	break eventually  returns  a fixnum,  then  it
     returns  with  the equivalent  machine  fixnum  in accumulator  TT.  This
     routine is  useful primarily  for the error  checking;  if it  is already
     known that A contains a lisp fixnum, the instruction (MOVE TT 0 A) serves
     just  as  well.   Such  knowledge,  for  example,	can  be  derived  from
     declarations by  the fast-arithmetic compiler.


(JSP T FXNV2)
(JSP T FXNV3)
(JSP T FXNV4)
     Similar  to  FXNV1, but take  arguments  and  retqrn  machine fixnums  in
     different accumulators:

       FXNV2	 B   -> D
       FXNV3	 C   -> R
       FXNV4	 AR1 -> F

There iq  no FXNV5  -  yoe must  move  an argument  in	AR2A into  some  other
accumulatkr first.


(BSP T IFIX)
     TakeS  a Machine flonum  in TT and converts  it to a  (truncated) machine
     fixnum, returned in TT.  Destroys accumulator D.


(JSP T IFLOAT)
     Takes a  machine  fixnum in  TT  and converts  it	to a  machine  flonum,
     returned in TT.  Does not destroy any other accumulators.


(JRST 0 FIX1)
(JRST 0 FIX2)
(JRST 0 FLOAT1)
(JRST 0 FLOAT2)
     These are convenient  exits to the  following code internal  to the  lisp
     system:




Page  4-61			    ∪14-.7.3			   March 6, 1979
									       



       FIX2    (JSP T IFIX)
       FIX1    (JSP T FXCONS)
	       (POPJ P)
       FLOAT2  (JSP T IFLOAT)
       FLOAT1  (JSP T FLCONS)
	       (POPJ P)


(JSP T FLTSKP)
     Verifies that the S-expression in A is a fixnum or flonum; if it is  not,
     a wrng- type-arg error is signaled.  If it is, then the machine number is
     returned in accumulator TT; moreover, the return skips if it Is a flonum.
     Example: here is a simplified vepsion of the sub1 function which does not
     accept bignums:

       (LAP SUB1NOBIG SUBR)
       (ARGS SUB1NOBIG (NIL . 1))
	       (JSP T FLTSKP)
	       (SOJA TT FIX1)
	       (FSBRI TT 0 1.0)
	       (JRST 0 FLOAT1)
       NIL


(BSP T (NPUSH -n))
     This routine pushes n nil#s onto The regular pdl; i.e.  it is  equivAlent
     to writing  PUSH P  (% 0 0  NIL)) n times.   n must be  between 1 and  20
     octal.  Note the minus sign in the above: to push 4 nil's one writes (JSP
     T (NPUSH -4)).  This routine is  used greatly by compiled code to	create
     pdl slots for local variables.
¬

(JSP T (0PUSH -n))
     Similar to  NPUSH, but  pushes zeros  onto  the fixnum  pdl.  n  must  be
     between 1 and  10 octal.  Used  by code produced  by the  fast-arithmetic
     compiler.


(JSP T (0*0PUSH -n))
     Similar to  NPUSH, but  pushes zeros  onto  the flonum  pdl.  n  must  be
     between 1 and  10 octal.  Used  by code produced  by the  fast-arithmetic
     compiler.





March 6, 1979			    ∪14-.7.3			      Page  4-41
			    Maclisp Reference Manual			       


(JSP D *LCALL)
     This routine is called by user lsubrs produced by the lisp compiler.   It
     accounts for the number of arguments, and saves some information so  that
     the arg and  setarg functions  can find  the arguments.   After the  user
     lsubr has been executed  it takes care of	popping the arguments off  the
     pdl and returning to the caller.


(JSP D (*LCALL -1))  
     Used by user lsubrs declared to be of type fixnum.  It performs the  same
     setup as *LCALL, but also sets up a number-consing return by doing  (PUSH
     P (%  0 0	FIX1)).   *LCALL skip-returns;	the following  instruction  is
     always (JSP D *LCALL).


(JSP D (*LCALL -2))
     Is like F3(*LCALL -1), but is for flonum-type lsubrs.


(PUSHJ P IOGBND)
     Used by compiled code to perform the iog function.  Equivalent to the code

	       (JSP T SPECBIND)
	       (0 0 (SPECIAL ↑W))
	       (0 0 (SPECIAL ↑Q))
	       (0 0 (SPECIAL ↑R))
	       (0 0 (SPECIAL ↑B))
	       (0 0 (SPECIAL ↑N))


(JSP T (*MAP -n))
     Used by compiled code to call the various mapping functions in the common
     case where there are two arguments.  The function should be in B, and the
     list in A.   (This is backwards  from the standard  order!) n  determines
     which mapping function as follows:

	1   maplist   3   map	    5	mapcon
	2   mapcar    4   mapc	    6	mapcan






Page  4-63			    ∪14-.7.3			   March 6, 1979
									       


(JSP T *SET)
     Used for compiling calls to the function set.  Accumulator A should  have
     the value (second	argument to  set), while  AR1 should  have the	atomic
     symbol which is to get the value (first argument to set).


(JSP T *STORE)
     Used for compiling  calls to  the function store.	 (The conventions  for
     this routine are undergoing some change, and thus are not described here.)


(PUSHJ P *UDT)
     Used by compiled code for handling undefined computed go tags in compiled
     progs.  The tag is in accumulator A.   It handles the case where the  tag
     is really a fixnum; and if not, signals a correctable error and  possibly
     returns with a corrected tag in A.


(JSP TT ERSETUP)
     Used for compiling calls to the  function ERRSET.	Accumulator A has  the
     second argument to ERRSET,  and B has  the address to go  to if an  error
     occurs.  This routine pushes various things onto the regular pdl.


(JRST 0 ERUNDO)
     If all the code compiled for the first argument to an errset runs without
     error, it must go to  ERUNDO to undo the errset,  i.e. to pop the	things
     off the pdl  which ERSETUP pushed.   Control is returned  to the  address
     given in B when ERSETUP was called.


(JSP T GOBRK)
     Used by compiled code when a go is done within an errset (yech!).	It  is
     similar to ERUNDO, but  returns to the instruction  following the (JSP  T
     GOBRK), rather than to the place specified to ERSETUP.


(JSP TT (ERSETUP -1))
     Used to compile calls to the function catch, which internally is  similar
     to errset.   Accumulator A  contains the  second argument	to catch  (the
     catch tag), and B the return address which is used if a throw is done.



March 6, 1979			    ∪14-.7.3			      Page  4-64
			    Maclisp Reference Manual			       


(JRST 0 (ERUNDO -1))
     Just as ERUNDO undoeq an errset, so ERUNDO-1 undoes a catch.


(JSP T (GOBRK -1))
     Similar to GOBRK, but breaks out of a catch rather than an errset.   This
     is what a throw compiles into.


ARGLOC
     This is not a routine but a  variable, which contains the address of  the
     pdl slot just below  the arguments tk the	most recently called lexpr  or
     user lsubr, or zero if none has  been called.  Thus the call (ARG 2)  may
     be coded in lap roughly as:

	       (MOVE T ARGLOC)
	       (ADDA T 2)
	       (HRRZ A 0 T)

     This iq one of the variables set up by *LCALL.
¬

ARGNUM
     This, like ARGLOC(λASLABAm¬eSCE1J\∪∪PAG←]QCSMf↓iQJA9k[EKHA←LA¬eOk[∃]ifAQ↑~∀@@@Ai!JA[←β≠QβK,≠↔;Q∧¬F/G∞$ε␈∩∞↑6/∩∧
G∂..$ε≡∞MEBε∂4∩εf≡>αεw]\&/∩d∧ααF≤86/∨=≥f8h$∧αααλ~$<UYPεNvM≡&.∨MO∩π>≥IBαε|dε≡␈↑.6(Nl↑F≡B∞Mε*ε\≤6FNlTαεw]\&/∩e∀α¬&∞↑2αε⎇lPhR∧∧ααε]≤vG"∞}&O&T∩ε7]l7&N⎇g hPQ$ααα∧∧ααDH~α∧
(ybk∩
:T∃∩⊃Q"αα∧∧αααλ~$=~λ~$<rV$αDt→Dαrβ¬∃⊂hP∀∧ααDYzd*¬JD∧α∧~(tu,U⊃∩αβ<|W"εn]V⊗/$
v"ε≡,w_h!∀αααλ8∀L<T
E"β5⊃⊂Jαπ=f..D↔"εL\↔∨"ε1PPJ∧∧αDdZ*"βα¬∧R¬≤≠λ$M"	HU≥~
I∧rε4∧
∀z5∩Hh!∀αααλ_D"¬JD∧
∀yIt~H∀∧β↑6↑L6BπMRεf≡>@hP∀∧ααDλ*%R∧∀¬S∩¬JE⊂Jαπ0ε∂⊗t'/"ε!PPJ∧∧αE∧z	"¬α⊃Q"αα∧∧αα∧i→@hPQ!PS"fuc"α
-w/&≥lW~∧m}"¬/<Tε↔J	⊗v"X=v&.D	D
Q!PPh!Q hU≤v*αεES3(⊃⊃∩αα∧α3"β+MeFb""$∧λ∪8.,zλ
ED.-g⊃"@									       


   There are some routines internal to pdp-10 lisp which are not used by  code
produced by the compiler, but which may  be of use to those writing  functions
in lap.  Unless specified otherwise, the  symbols for these routines are  also
predefined to lap.

(PUSHJ P PRINTA)
     This routine is the internal lisp print function.	It does not actuallq
     perform any output, but merely supplies a stream od characters.  It is
     called with the S-expression to be printed in accumulator A, and the
     address of  a routine  in R.   The  sien bit  of R  controls the  use  of
     slashes:
     zero means produce  characters like  prin1 and explode  would, one  maans
     like princ and explodec.  PRINTA  will generate characters and pass  them
     one at a time to the routine specified in R by placing the ascii code  in
     accumulator A and doing a (PUSHJ P  0 R).	(This violates the rule  about
     putting non-S-expressions in gc-protecTed	accumulators, buT for  numbers
     less than about
     2000 octal  this is  guaranteed  tk be  a	safe procedure	anyway.)   The
     routine may do anything  it wants to with	the character, buT must  av@=SH~∀@@@A⊃Kgie=sS]N↓iQJ@↓G←]i∃]ifA=H@AC
Gk[k1Ci←eL∪∧XAX@A)PX@AC9HA$XAoQS
P@ACIJ~∀@@@ACMgk[K⊂AErAA%∪≥)∧Ai↑A	J@Ag¬MJ\@↓∨\Ai!JA←i!KdAQ¬]HX@↓β$bA¬]HAβHeαACIJ@A]=h~∀@@@AC1iKeK⊂AErAA%∪≥)∧AC]H↓[CrA	JAkg∃HAi↑↓G←[[U]SGCQJA←m∃dAgk
GKgg%mJAG¬YYfAQ↑~∀@@@Ai!JAe←UiS]JlAJ]N8AiQKdA[Cr↓Q←YH↓EsiJ↓a←S]QKefX↓KiF\@QβO¬S\XA∧@AmS=YCiS=\~∀@@@A←_AiQJAekY∀XAEkP∪iQSLASf@↓CYXAISOQhACfA1←]N@↓CfAi!Kr@AA←S]h↓i↑∩EMCMJD4∀@@@AaYC
KfHA1SWJ@↓aIXAMY←ifA←dA	S]Ced@AG←⊃J\RA]QK\@↓!%∪≥QαASfAI←]∀ASh@↓oSYX4∀@@@AeKiUe\Ai<∪iQJAS]gQekGi%←\AC→iKd∪QQJ@AA+'⊃∀Ai↑A%h\@@↓)QJ@↓G←]i∃]if@↓←L~∀@@@A¬GGk[UYCi←HAαACIJA]←PAaeKMKemK⊂\@AaC[aY∀t~∀@@@A⊃∃eJASLABAMU]]rAYKegS=\A←L↓MYCiAoQS
PA←]1rAG←U]ifA
CaSi¬XAYKQiKef8~∀~∀$@@@@!→β A¬→!⊃→¬)εA'U¬$R~(∩@@@Qβ%∂LAβ→!!→β)εQ≥∪_\@bR$~∀∩∩!!+'⊂↓ @PJ`@`A→∪0bR$∩wSh≥fA≥π¬→→CE1JB~∀$∩Q!+M⊂A
1@@PJ@@RR∩w
←k]i∃d~∀∩$Q≠∨-∃∩Aβ$Iα@`A→1 R∩meK[K5EKdA]QKeJ↓ShASL~∀∩∩!⊃%%∨$A$Aπ=+≥(R$∩wae%]FAgQsYJ~(∩∩Q!U'⊃∀A@A!%∪9)αR~(∩∩Q!= A
1@A)(R$∩wa←@AG←k9h~∀∩$Q!∨!(A R~(∪π∨+9(∩Qπ¬∪∂
A∧@b`b$∩∩w←9YrAG=k]hA
CaSi¬X~∀∩$Q!∨!(A R∩$vAYKQiKef4∀∩∩Q
β∪∞A∧@bfd$~∀∩∩!β∨&@@@`AβHeαR~(∩∩Q!=!∀A $~∀∩@@A≥∪0~∀~∀4∀~∃≠¬eGP@XX@br\r∩∩∩@@@&DhZ\n8h∩∩∩@@@@↓!COJ@hZlT~∀_∩∩∩@@A≠¬GYSg@A%KM∃eK]G∀A≠C]UCX∩∩$@@@@@@~∀4∀~∀QA+'⊃∀↓ A∂Qπ∨$R4∀@@@A)QSLAgs[	←XASLA]←h↓W]←o8Ai↑A1C`vA%hASf↓S]iK9IKHAAeS[CISYrA→←dAgegiK[L~∀@@@Aae=OeC[5KefA=\A∪)LAoQ↑↓]KKH↓YCeO∀AEY←
WfA←_AG←e∀AM←d↓gaKG%CXA∩=≡AIKYSGKfl~∀@@@AQ←]KmKd0AShA¬Yg↑A∃qSgiLAS\A⊃KFZb@AYSg@\@A∪PASfA
CYYK⊂AoSi AiQJ↓]k[E∃d@A←_~∀@@@@c⊗↓EY←G-fA←L↓G←eJ↓IKgSIKHAS8A)(\%→Sg`↓CYY←
CiKf↓BAgS9OYJA	Y←GV↓←L@A
←eJ~(@@@@↓iQCh↓YCeO∀AC]H↓eKikI]fAi!JACI⊃eKgf↓←LAi!JAMSIghAo=eHA←_AiQJ↓EY←G,AS\@↓)(\~(@@@@↓∪hA[¬rAIKMie←r↓gKmKICX@A=iQKd↓CGGk5kYCi=efAS8AiQJ%ae←G∃gf\@↓→Sg`↓[Cr@↓←d~∀@@@A5CrA]=hACGQkCYYd@AGCUgJAi!JAG←IJ@Ai<AKqSMhvASP@A[KIKYrA¬YY←G¬iKf@↓CIIe∃gf~∀@@@AMaCGJ↓C]HAAe←[SMKfA]=hAi↑↓kgJA%hAM←HAC]sQQS]N↓KYgJ8@A)Q∀AGCY1KdAg!←kYH↓I↑~∀@@@AQQJACAae←aISCiJ@]π¬1⊗AGC1Yf@A=\A∪)L@Ai↑↓GCkg∀@AiQ∀AG←e∀@Ai↑↓KqSgP\@@@!∨\~∀@@@A⊃KFZb@AYSg@AoSY0AGCkMJAiQ∀AG←e∀Ai↑A∃qSgh0AM←d↓iQJAAeKgK9h\R~(~∀~∃%≥⊃∪¬%(~∀@@@A)!SfASLABAm¬eSCE1JAoQ%GPXA%LA]←8[uKe<XAga∃GSMS∃fAiQ¬h@QB$AkgKHAS]i∃eekaQf~∀@@@A[¬rA]←PAEJAAe←GKMgKHX↓EkhA5kghA	JAIK1CsKH0AC]HQDRA1Sg`A5CrA]=hAeK1←GCi∀~∀@@@AC]dACe¬¬sfAo!K\AO¬aECO∀AG←Y1KGiS9N@@#M!β7πJβ'	β&C∃βπ↔∪πeβ5+;∂SL{;Mβ∂∪∀4)α↓↓↓β≡33↔ ¬BεF}|W6/%∃`M&
~2εO4∞W≡.D∞π⊗N\≡&Ng∀λλO∀≥~→$
~<|∧∞}<⎇].h≥
!"H∧∧λλ≠M⎇9]→..]<≥∧];XnM9{H
≡h≥<n\;≠≡$∞⎇9YM≤z9;ND→[tD∞<y4N5Hλ∃m;H∩)i∩0R*D~<c!$λλλ∧∞Y<y.D≥≠h∧∂Y<[d∞~→(∧∞[⎇5
≥Y(∩)j∀Q3∧∧≤z≠n]→λ⊂⊃→P⊂1`[42rελ:7DaZ2quP→5y⊂⊂_w<FEλ⊂⊂⊂⊂→2v0|Yr⊂4w≥2y9:\:9P⊂≥t4qtλ6p|Pλ12P8→w24w→W⊂⊂⊂∪4πte that INHI@IT does  not
     prevEnp uncorrectable errors and control G oR contpcl X quiTq.  Thqs,  it
     is pReferable To the jginterrupt f@U]GiS=\∪oQ∃\ASh↓SfAI∃cSeK⊂Ai↑@↓S]AS	Sh~∀@@@AUgKdA%]iKeIkaif↓Ech@↓]←hAEkSiFQgkG @AgSQkCiS=]fACIJAeCIJ∪Kq
KahAαK9↓βd@4λα↓↓↓β≡{∪∃%p↓αS#*βGSπv#πK⊃π+Oπ∨*β?→β&C'Mβ≥;'S∂@∧εO≠!Q hP⊃∀ααα¬
¬-≤∧λeEα	→dDL)~BHh!⊃∩αα∧¬¬≤-IyRβα	→dDL)~BHh!⊃ααα∧¬brr∞∞&}≡↑:2π>≡Mαπ∂8Z"εNnLWπ↔↑
G4~;Z
≤X=→,DKCAQ@∧DPλ⊂⊂∀(∃i`%⊂∀⊂ gTRAL)
λ
∧@@A≥=iJAi!ChA∪9)%_↓oS@3bβ∪-βλ∧αE∧βtλλk∀λ∩)@  	Bλ¬(R\~(~(Q)dM
Y~@h↓Hλλ∧∧∃~~.P9{t]1t⊂ )nhibits alhλAS]QKeE(επ'~≥f"π≤¬0∀≥9S⊂⊂∃42P ,e`
HAαCπ3→∧¬↔4→S`→λ⊂:y`%	α     b@2↓iQJA≥CeEC≥JAG↓x¬FF.>Mwαb≥f"ε⎇mGJπMRε>_∧XL≤βrP#olle@
aP∨IλJS#∃¬∪'>∞@εF∞β→C!⊂⊂⊂⊂λ0¬a@2↓EJAjMK@⊃β↔Iβ@.8XD∞≤[qn8εyP_<P:`3ijg (HLDOS 0 NNQP∪( Aa↑@β#@/⊗βH∀\⊂7w, a`≥↓ h ∩α∧∧αα∧α∪∪)P⊂_λ''hjRh∧ ∩∩β#5βSαXMdλ~0~λ10q`+ `∂M↓2q↓απ0εF/∩∧
∞↓y0∞I9@
β& ∧αε⊗≤8
a≥yQH∞M→#"D∧λλλ∞0∂utine CHAC@↔∩AgQ←β+3⊃β⊗)β∂πdc↔↓β&y↓β∂F+∂-β4{@∩α≥gJεLYF∂N\@λ∧
9]→.∞]<∃∞P7yεB⊂⊂⊂⊂λ8zt`4q"  Thqs The standard usaga iS8
α

¬
Pace  4-67			    ∪14-.7.4			   March 6, 1979
									       



		    (HLLOS 0 NOQUIT)
		    ... process with NOQUIT non-zero ...
		    (HLLZS 0 NOQUIT)
		    (PUSHJ P CHECKI)

     This is somewhat less useful than the user nointerrupt function, but was
     implemented first.  Note that the routine INTREL described above under
     INHIBIT is equivalent to

		    (POP FXP INHIBIT)
		    (JRST 0 CHECKI)

     and thus if for some reason one wants to pop the old value of INHIBIT
     oneself, CHEAKI may be used instead of INTREL.  CHECKI preserves all
     accumulators.


(PUSHJ P UINITA)
     This routine sets things up for opening a file, old I/O style.  It takes a
     file name list (name1 name2 dev user) in accumulAtor A, and on ITS a mode
     in the right half oplied   as  for   the  uread  function.    In  the	dec-10
     implementation, the device name is placed	at location UTIN, and the  ppn
     in USN (the latter tag is not known to lap; beware!); the file names  are
     returned in T and TT.  In	the ITS implementation, the mode, device,  and
     file names  are  placed in  a  three-word	block suitable	for  .OPEN  at
     location UTIN, and the lisp's sname is set to the appropriate user  name.
     The contents  of  accumulator A  are  preserved.  UINITA  also  does  the
     equivalent of

		    (PUSH FXP INHIBIT)
		    (SETOM 0 INHIBIT)

     thus locking out user interrupts, on the theory that some I/O operation
     will take place which should not be interrupted.  It is up to the caller
     subsequently to  unlock  interrupts,  e.g.  by  doing  (JRST  0  INTREL).
     Example:
     on ITS, these functions provide a (relatively inefficient) method for
     binary input  (I/O  channel  17,  presently unused  in  pdp-10  lisp,  is
     usurped; beware, for this fact will change!):





March 6, 1979			    ∪14-.7.4			      Page  4-68
			    Maclisp ReferencE Manual			       



	    (LAP BINOPEN FSUBR)
		(MOREI T 4)	      ;image unit input
		(PUSHJ P UINITA)      ;set up
		(*OPEN 17 UTIN)       ;try to open it
		(LER3 0 (% SIXBIT BIN FILE NOT FOUND))
		(JRST 0 INTREL)		  ;must unlock interrupts
	    (ENTRY BINGET SUBR)
	    (ARGS BINGET (NIL . 0))
		(PUSH P (% 0 0 FIX1)) ;NCALLable!
		(*IOT 17 TT)	      ;input a binary word
		(POPJ P)	      ;return as a fixnum
	    (ENTRY BINCLOSE SUBR)
	    (ARGS BINCLOSE (NIL . 0))
		(*CLOSE 17)	      ;close the channel
		(POPJ P)
	    NIL



























Page  4
69			    ∪14%.7.4			   March 6, 1979
									       

	
4.5*5  The Multicq implemeNtation


α   YS[ OV@%-%&A;u:~∀~(~∧h\\Xl@A⊃CiBAIKaeKMK]iCQS←\~(~∀4R↓↓α3N[∃β7␈≠Q↓αdJNCMbα7W3&K∂M↓∧jε∞∩M~AβK-βK↔O,sSM↓∧b&NAπ3π3W-→↓βπ~βC?'w#↔KMαβS 8Q)f⊗V\>G
∩∧	⊗"πN⎇rπ6≥NV/~≡&*ε↑⊃Bπ&Tαπ'⎇tπε}≥nF/↔4∞ε}Nn@πεZ∞Mε*π<≥V*α
_F.wM≤6∞`Q(L-Y8u¬A"C"D∧λ⊂(∞
z;]↑H~4d∧_(~≥wV{w\2⊂2w≥4z4Wλ⊂⊂$zλ1ww9Zyz9P≠s⊂⊂0[⊂⊃4w→4y2q]⊂:7Pλ9rsvYw:εE≤0tp∩," which iS the  principal pointer Op indirecT-word  foRm provided by  the
hardware, with some additional bits which specify the data-type od the	object
pointed to.  These bits are  arranged so that all  common type testing can  be
done in a Single instruction.

   Numerical values are represented  somewhat differently.  Since the  pointer
is big enough to hold  a machine fixnum or a  machine flonum, these LISP  data
types are not represented as objects in their own right.  Instead, the machine
number is stored directly in  the pointer.  A special  code is also stored  in
the pointer which makes the hardware refuse to use it as a true pointer,  i.e.
any attempt to indirect through a number-pointer will cause a fault.

   The arrangement of bits in an ordinary pointer is:

      --------------------------------------
      |   segment num  |ring|  type  | tag |
      --------------------------------------
      |    word num    |	 0	   |
      --------------------------------------

segment num and word num  together make up the	address of the object  pointed
to.  tag contains  a magic value  which informs  the hardware that  this is  a
pointer.  ring contains  a ring-validation  level which  is of	no concern  to
lisp.

   The arrangement of bits in a number "pointer" is:





March 6, 1979			    ∪14-.7.5			      Page  4-70
			    Maclisp Reference Manual			       



      --------------------------------------
      |		 0	    |  type  | tag |
      --------------------------------------
      |		  machine number	   |
      --------------------------------------

Here tag is set to  a different magic value,  which informs the hardware  that
this is not really a pointer.

   The bits in the type field are:

     Fixed     this pointer contains a fixnum.

     Float     this pointer contains a flonum.

     Atsym     this pointer points at an atomic symbol.

     String    this pointer points at a string.

     Subr      this pointer points at an entry point to a machine-executable
	       function.

     Bignum    this pointer points at a bignum.

     System←Subr pointer points at a subr  built in to MACLISP.  The Subr  bit
		 this is also on.

     Array    this pointer points at the header of a lisp array.  The Subr bit
	       is also on, because arrays are also functions.

     File      this pointer points at a file-object.

     We can see that if any  bit is on, the value  is atomic.  If no bits  are
on,
	       i.e. the type field is zero, this is a pointer to a cons.

   Now that we know what pointers look	like, it is necessary to discuss  what
the objects they point at look like.  [OR, Having discussed the representation
of lisp values, now we will discuss the representation of lisp objects.  ]

   A consists of two values (or pointers), first the car and then the cdr.

   The representation of fixnums and flonums has been discussed above.

Page  4-71			    ∪14-.7.6			   March 6, 1979
									       


   An atomic symbol consists of a  structure which contains two pointers,  the
length of the symbol's	pname, and the pname  itself.  This structure is  thus
variable in length, since there is no limit on the length of a pname.  The two
pointers are the symbol's  value cell and its  property-list cell.  The  value
cell contains  either all  zero  bits, if  the symbol  has  no value,  or  the
symbol's lisp value.   Since the value	cell is  the first item  in an	atomic
symbol, the value of a symbol can be referenced very quickly, by  indirection.
The property-list cell	contains the  list of indicators  and properties  that
have been placed on  the symbol.  This	list is nil when  the symbol is  first
created.  The atomic symbol nil  is an exception, however.  Its  property-list
cell is  always nil  in order  to ensure  that takiNg  the cdr	of nil	always
returns nil.  The actual property list is kept elsewhere.

   A string is	represented as a  word containing its  length, in  characters,
followedby the characters themseLves, in the machine's string format of  fkur
9- bit characters per word.

   A bignum iq represeNted as  a header word, with the	sign in the left  half
and the size In the right half.  The sign iS 18 0-bits for a positive  number,
or 18 1-bits for a negative number.  The size is the number of words  (machine
fixnums) required to represent the number.  These words immediately follow the
header word.  Each word contains  35 significant bits.	The least  significant
word is first.

   The representation  of  a subr  is  a header  word  followed by  the  first
instruction of the subr.  Normally  this instruction calls a small  subroutine
which saves the information about  the caller that has	to be saved [???]  and
then transfers to the subr proper.  This subroutine can be system-supplied  or
generated by the compiler.  In the case of some simple subrs, for instance eq,
the subr-object transfers directly to the subr proper.

   The header word contains in its left half a specification of the number  of
arguments requIred, and in its right half further information.	In the case of
A compiledlisp subr, this is  the relative address within the object  segment
of the machine code for the subr.  It is used by the linkage subroutine.   The
right half is not used in a system subr.  In the case of a subr (fixed	number	
of arguments), the left half is the number of arguments required.  In the case
of an  lsubr, it  is the  maximum number  of argumeNts,  in 9  bats, then  the
minimum number of argumefts in the nexp 9 bits.
¬
   The representation of an array iS a hea`er block which is pointed at by the
Lisp value.  This header Block descRibes the  array and points in turn to  the
Actual array of values or machine numbers.

March 6, 1979			    ∪14-.7.6			      Page  4-72
			    Maclisp Reference Manual			       


   The representation of a  file is a large  structure which contains all  the
information required  to  access the  file.   This includes  both  information
needed by lisp, such as the eoffn,  and information needed to access the  file
in the outside world, such as a pointer to and pathname of a segment.


4.7.7  Environment, Stacks, Registers


   The lisp environment is  contained in several  segments of storage.	 First
there are the object segments.	 These are read-only segments containing,  for
the most part, executable machine code.   There is one object segment for  the
lisp system itself, another for the compiler, and another for library programs
such as  grind.  When  a  user's lisp  functions  are compiled,  the  compiler
produces another object segment.

   There are "lisp.lists"  segmefts, which  contain list  stpucture and  oTher
lisp- objEct represEnpadions.	Thes@∀AgKO5K]if↓CeJ@↓[CS]QCCMK⊂AErAQQJ@A≥CeEC≥J~¬G=YQKGQ←d\~(~∀@@↓)QKe∀ACeJAASg@]giCQSFDAl}}␈:↓cKO[∃]if\A)QKMJAG←9iC@'pβ∪πSλβ;?Q∧kπ;π>+⊃↓β↔H4+∨∂∪π∨*β∂?3f+∂S'|q1↓β¬∪';∂Oβπ33JβS#∃αβC↔C⊗+G.nL↔&N⎇n2ε↑d∧π∨...2αF,ZBαεmzBαπMPhVβ08m
;Y(=y→(
≡≤y3@∀V⊂ 4he  Representations of arpays (but n`∨(↓iQJA∃YK[JαsQ↓β|04+SF)βπKα,↔O~α+λ≥Yλ⊂~~2P92\92yb[80`∀ions od∧AMRαc∃'|-&.∨N5`hPβ"H∧∧⊂;@≤α24`4ion There are Two "lisp.stackλAgKO5K]if8@A∂]∀ASfA
CYYKα!βC#(@⊗n∂-<V HαP	@4ack, or @[¬`/⊗ ∧πε&ADε∞vDλ

(∪`:~2y4he uNmarked stacc _↓∧¬w$≥;[,≡X¬r@d pdl.   Dhe
∃[¬`/⊗ ∧πε&@
∞P⊂⊃6Xy0E↓⊂@	β
β∀απ~⊃(↓pq10Yβ`
A↓_
vF@→0⊃@tor,  he`≥εε)β@.8P	↓≡≠`→]4πre  `iC@∩¬MC1c@↔
∧εF.O
pL≡X∧v 9,∧@A	!J@Akαs'π↑+⊃βC&`'πM∧εVf↑ip
md≥≠h∧∞~→(py10Yβ`
@@α≠?33,∧7Mβy⊗εBαhe@]
JAkgα#⊃βSzβ@∨&|∧Y$αpq@(ine  ta`→↓(∧G4≤⎇0⊃Z⊂0`∪ i`∪G↓_∧FF↓_;Y-}<h⊂↔≥vq2@2pε@1↓∧ε7.⊗-x
.M8π %
λ¬eKiU`rλλ9NY<`→YyP@ε#@&~βB5
(λ~≥tπ p⊃QfAβIJA←Lπ#↔ 2∧∞↓yp %↓⊂AC@:∧@λ∞βx8$d inA`↔m⊂≤m]KC"Hlπy⊂h¬YgiC9C@∃0∞fF.βH⊂⊂H30∃NBti`∨\αβ'Mα(
gε.,P	∧∧~0
 pπCM↓(ε2εNL∧h∞2r ∃↓I\ACI⊃aKGf↓C]H↓Sif~)CC@3`∧G$βyP ,in`↔↓∞;∃βBx¬εw→<@⊂λ⊂9r@$ beL↓9h
%↓¬fbπMBαπYmV∂⊗αp∩@d pdl,  anD pus@!Kf@Aβ≠77∀hS@&.β<↔≤αa`%↓Hβ←/K↑K;≥β≥βπ∂∃¬vw≠h:~2P -Ap¬WK↓ ∧πε&A`λ∧λ8
 ∪ arg@*εk↔+Sα4ε∂⊗Tλ-Ny`λ≥y]@∩↑p¬d
on the marhπ@↔⊂∞ε&∞h⊂~~2|@ !p¬JA`β+@≡↓→0∩ mj @EdA`∪"*βππM@	∞↔

λ∧@@A¬`AiQ∀AEC_@N↑d

(≤`∩XπmeNT	conTa`∪@:¬⊂L↓P:42Bzp∞@[¬`/⊗∧@λ∞≠∀≤β  @Bαβ6OX	∧∧_0	2XF@
kNown @¬`
βSF)↓O&∂
αF+π&↑ D⊂⊂$@4 ic @Ma@∨K,∧Bπ~⊃ 9→P7w6≡P:7P~¬a`↔↓*β'Qβ0∧W.∧P %¬`∂e↓εFxhαX9NY<`→Kα  @)!J@Afβ#π∂-αβ#↔π&+@∩αλ0Mnα0t`.pεβB↓mCESα#Ce↓∧¬f!8∧w3≠y0
Atiof  tπQSGαA↓β&α1P@,\Y0_≥p¬`≥i1rAeKα3↔K↔v≠↔"-w&B/∩πελTεFO>∧π?<⎇→-∀_;Y∧↑(⊂⊃≠vx4@,e`λAXαK@∨α∧λ	N↓w1z4[w9WεBαAd`&↓G←]i∃]afAαK;∂2(∧F+Pβ"C!⊂⊂⊂(≠pp∞tep¬fAi<AS@;&+@⊗↓X;λ
≥YSp→~pz4`/n stoped ⊃QgKo!KeJ\4⊂λ(αC"Jymbols t and  nil,
with their AtsYm type-bits turned on.)

   The in←pl1←code flag, which says whether execution is currently in the lisp
environment or the PL/I environment (see below).

   Pointers to "operators," which are  subroutines tk perform operations  very
frequently required by compiled code.  These exist because they can have  more
efficient calling sequences than the full general lisp calling sequence.  Many
operators  perform  operations	which  are  performed  by  special  forms   in
interpreted code.  (Other  special forms  are compiled	directly into  machine
instructions.)	The  table  of	pointers  to operators	is  required  so  that
compiled code doesn't havE to be "linked" to the operators when it is load'ed.
This would be  time- consuming and  might prevent sharing  of compiled	object
segments.  The operators are described in more detail below.

   [Registers]


4.7.8  Calling Sequences


   [ TO BE SUPPLIED ]


4.7.9  Operators
¬

   [ EXPAND FROI THIS LIST ]

   bind unbind errset1	errset2 Unerrset  call catch1  catch2 uncatch  iogbind
unseen go  tag throw1  throw2 signp  return err cons ncons  xcons  begin←list
append←list terminate←list compare link








March 6, 1979			    ∪14%.7,7			      Page  4-74

		      I.    Glossary


a-list pointer
     An  a-list pointer is a  number which can be  passed as an extra
     argument  to  eval   or   apply   to indicate  a  particular
     binding  context in  which variables  will be  evaluated.	It is
     similar to,  but not  the same  as, a  pdl pointer.   An  a-list
     pointer may also be   nil , which indicates the global or "top
     level"  binding  context.	 The  name  "a-list  pointer"  is  of
     historical meaning only.

    

abbreviation
     Abbreviation  is  a  feature which  allows  large	lists  to  be
     truncated when printed out.  See section 13.7.



alarmclock
     A facility by which the user can specify a function to be called
     after  a specified  amount Od time  has elApsed.	"Time" may be
     measured as real elapsed time or as CPU run time.
¬
    

αaltmode
     A c@!CeCGQKdAkMKHAS8@AiQ∀AaI`4b`AS5aYK[∃]iCi%←\A←α1α6ε≤b&NAr↓απ3≡x4)↓α↓↓β∂∞c3↔⊃ε+G∂π∧∧Rε␈$
π⊗.m∨α`h!Q hPQ(λ.∞≠~8l≡~;{AQHλλ∧∧⊂<≤
M8x=
≥{H⊂m⎇\z4nNhλ≠l@⊂⊂⊃0\86<t[3Q⊂0H⊂3:w_z4wgλ⊂:7P_P⊂6$\z⊂⊂'Yα
α     areume@9ifAC9H@A←	iCC]%]NAi!J@Am¬YcJA=H	↓β&C∃β≠,s∂S'}q↓β≠xε O&
z6(h$∧ααα≡& >990↔≥9S⊂⊂⊂x86 )catiOn  iS explai`≥Jα!↓β'p∧ε&/L≥⊗bα
→bε≡≡π&/$∧β~pQ$ααα∧6%Hλ→.l9⊃8.M;{CAQ@εE⊂λ⊂⊂εEβA0y3]vrw:βA⊂⊂⊂λ⊂ w⊂_y3`∃@5K]h@αK@~ε≥`ε}⊗,X7απ⎇
⊗≡B
~2ε>≡lFrπMtε
εnYf∨&≥ybπεtn<X=Q ¬⊂⊂λ⊂⊂7g⊂⊂  !p¬`∪←_@AiQ∀@Aae=G@↔O~β?	↓∧∧W6∞β⊂~p]4p∞GABAα{@⊗(λ⊂⊃[w9t@3ts  O`∧∩(α↓↓↓β&+@⊗Om⊂LP0`2gumentpεAMe=ZAiQ∀AMO⊗i1β←FK∂!αLε2εW↑8
∧(⊂⊗)pπhA↑α1β'S,¬W4β
     For EaC[aXα!1↓β>C↔9↓¬##∃↓∧∧f␈⊗β(λ¬XπwPλ→P∀ λ'πMαβ↔[πe+πS⊗∧@λ∧∞~⊃#!⊂⊂⊂⊂λ0p∩gum`@;'→β@&t

(⊃@:[1z4`/n	fO8@AC⊗)↓↓Mαβπ;⊂α↓Q↓aQ h↓@εE!pithmetic
λ~¬βAaS@0β⊃@∩b∧&&@X¬∩∩$@A∂Yα{@∨≡_↑!⊂(λλ∧∧λλ∀≤βrP)	
λ	↓	    MaclicP Ref@∃`↔~_R∧n≥nV∞`Q!PBα∧∧α∧l_9DM≥∧∧ε≡}nL⊗Nw4λg∞v>M⊗}w4
FzπXL@1y6@λ0y4`4hhKi%FA←aα+@⊗∞M_mnh≠sAQHλλ∧∧~;]\βry9H4πf @¬aE@''∪πKe∧ε6OVT∧ε∞v@λMd→S↔Xz4w3Kx7tg≥⊂7:vX2y0∪ with↓B~∧@@A`β∪↔∂'α=ε}p≥xbε∞-zW"εY⊂	m∞α9→,=8ε`vλ860qYyP∞  Sae @
QCAi∃`@@@8β⊗|H⊂⊂CE⊂⊂⊂λ⊂24iXzyy`)on o_AaQJβ≠∃β≠,¬f∨&≥xNUαEεBα
+∂∪@⊗∂⊃Q"αα∧∧∧∞r∧λλ.∞X:(
≡h_;D
βy22\αed  pπ@↔⊂∧¬f $_q ⊗~9S⊂⊂⊂pqdλ1rf, iai contain A
λ∧@@@A→β'@A@∨T∧V∨"d∧α¬&Tεv∞β0∩Pλ0πf @QQJ@Aα@↔⊗_ε(
≡`8;∞wP:4→P⊂70Zp¬ O↓_@AC\4⊂	↓↓α↓βπ∞∧0	.ytw3H32g!≥4p∂nA`∨#H&Bπ⎇λVrαλ⎇↔6.dn\Xp`→~x:0∪  ac  arg@*εk↔;∪α5@H↓Hλλ∧∧≤Y0~≤¬r`≥fA`∪"*βπ?≠&+;@'4∧ε}H≥~Tλ_`∩~0∧ s@∃QKGi∃H@A¬dA`∪"*β@∨.(∧`⊃≤αipts,∧∀ λλ∧∧λ⊂
4→P3:`.atio@8@Agi=`∃↓∧¬V∂Jλ,Rπ8p∩`$ po¬`∂O≤⎇bπX;⊂~YyP:7H8∧he c`@3`ε0hR∧∧ααε|dε∞r∧λ↔.X8Wλ⊂ ISP a@%ICsfAαC∃β_¬⊗n∞β_<D∧≥≠hλitU∧H→β⊂ y≤αays excE↓A`∀ ∧ααα∞Mε∂"∞Mε*α∞8
,.x|Z.∞α9P "ec`∪\αβπA↓αβ';∂&+π"
p→D∧λ ⊗_u24hey@¬`∃α¬Yw, εE⊂λ⊂⊂⊂'eneral be@
CkG
↓aQJAα{∂∂W∧∧⊗w≤hλ
|β⊂:4→P9r`6eral c`@3`ε2εV\P	∧β0∂@hαβπ30hQ↓↓↓αβ∃αxbπεTπ<8εrP≤8x2WβE
    
	∃CFα≠'∧Q$ααα∧∧&∂≡9⊂~$⊂⊂$@3   the↓Amep¬SGC8@@Aεβ#π+∪∂∪⊃↓α_¬f&*∧∧ε,βy⊂⊂λ p∞@Lαs@⊗↓89~-⎇A"@∧∧λλ∩-nα2y1Z0p∞Ge(∧@A&C'M↓¬↔4λ≥~T_p∀ \αactep∧@Aεαs∪∃β(ε6.λλ∀[8∧ernallY  by
     MACLISP ≤~(∩(Q!P@,8	y`(`π]K
εs@(α@⊂⊂λ⊂⊂ @ va`→↓(∧Bε80Pλ12P !pπgCO9K@⊃β&yβ¬β0∧↔-88[T~;B∞Nβw@ways 4bRA¬dA`↔∞¬_LF@
    the  F↓U]GiSα{9↓↓∧ε6/π∀¬Bαπ⎇
ε∞Bλ
0→H⊂9d`-iha@$!a@≥↓∧εFF*∧λλ.ypsw~p¬`≥h4⊂	↓↓α↓βOS∂#↔'↔u!β'dλm⎇9(↔≤42y  `	C]≥kCOKβ→1βπt!βeεFF*∞,VF∞¬→0∩λ32g!≥4p∂nS
α      s∃`⊃↓↓∧⊗v"∧λ,≤¬zw!≠zp∞DP_%IJβE↓α∪'hM⊗v:β⊃ accO↓5a@∪&α0~\α⊂!<CA⊂⊂⊂λ⊂⊂&!ibdaX∪ae=@
↓@λ7≤α  Do .  Bijdi@9@
β'~β¬β3|∧6∞Bλ≡7<∧sw6Yu:↔εBα     WhE8AG←]Q`}@∧ε@L80dpεAiQ∀AMK↓t∪C'⎇`λ∞]~8p∀λ⊂1`z\β`Hβ##∃α⊗K;∪'v91βSF(4R∧∧ααπh≥G∞(λ↔Xε the p
CE%CE@3*β'Lεα,W>≠p	2Y⊂:7P≥p0`4↓Sh@@β;πMβ∞&N←$

T≥~⊃!P¬⊂⊂⊂λ⊂14@.di`≥↓8¬`H⊂β"C!⊂⊂⊂⊂α@
a@&π≠?∂π∂#'?9¬FO∨AQ"αα∧∧∧∞Rλλ<nwq`)↓¬iS@?p∧αε~0`~λ4yP ! `	S_∞BεyH⊂∩≠z:2`$  paip¬f@0
v.α2`.↓`↔O⊗∧@λ∞|=~β!⊂⊂⊂⊂λ842P_εp@:∧0

≥y\h∧∧_0	@soc ,  acs@@@X@@↓cCggα{¬↓@_-lλλλ∞pyy`0 .~∀@@@A→←d@Aα+cπ↑	F*B∧¬αF
¬`λεE(λ
$→[`7H_TP∀≡⊂⊂↔≡TTP⊂_yyg`#iate@L@AB4⊂@@@AgSi @@h0∪D@Aβ;'C!α↓#≠⎇tβ
J¬Dε∞vA⊂∞∧∧≥z5
∧λ≡(¬@αAεEβ@
~∃αS/4hP4
C∞;∃β'H@$$⊂λvf←>8↔πλα λ∧∧λλλλ≡≤Z3∧εMKλε⊗-m#!↓A"""$λ{≠tn<<Z(∧∧λβ"AP¬⊂⊂⊂λ⊂ wλ0z7fH4yP⊂_P⊂&$Th⊂⊂'X52qjλ⊂;t4Xt⊂⊂$\β usually  pho@UKQh@↓←D@A¬f~∀@@@AS9ISmSβ≠'∪*q↓↓α∂#?7M∧≠?7∀LC9βO-3↔Kπb↓βSG∧+@≠∩∧fOFn]W~bh
⎇];<eA @λ∧∧λ_Z,]];<eD≤⎇≤M≥Y|k∧9Q⊂_z7vtXP9|fX7v9WβE
    

αatomic symboL	
     Anatomic	symbol Is a @QsaJ@↓←LACQ←ZAo!SGPA!Cf@A∧Aa]C5JXAB↓mCYk∀~∀@@@AGK1XX@A¬]HAB↓ae←a∃aibA1Sgh\@AαAA]C[J↓SfABAgie%]NA←_AGQCICGiKIb~∀@@@Ao!SGPA%IK]i%MrAi!JAgs5E←X\@AαAYCYkJ↓GKYXipulation.


autoload
     The autoload  feature allows  the definitions  of functions  not
     initially present in the environment to be loaded in from a file
     automatically  when  they	are required.	It  is	used  in  the
     implementation  of  special utility  packages,  such  as  trace,
     grind, and large application systems.



backtrace
     A display of pending evaluations, which can be used in debugging
     to determine  the chain of calls leading to  the point of error.
     The function  baktrace  prints this out.

    

base
     The  value of the	variable  base	 is the radix  in which the
     output routines represent numbers.  It is initially 8.
    


bignum
     A bignum  is an  integer of  arbitrarily large  magnitude.   The
     arithmetic  functions   pLus, Times,  difference,	 etc.	use
     bignums where  necessary and  automaticalhq manage  the  varying
     storace required.	For  exaeple, bignums make the computation of
     1000 factorial  easy to  write*  Becau@MJ@A←_AiQSL∪a←o∃d@AE%O]kZ4∀@@@ACeSQQ[Ki%FASf↓]←iS
KCEYdAgY←]KdAi!C\AM%qUkZ↓CeCi![KiSX∩∀~)βaeS0@dlXbrnj$∩∩@A≥Y←gg¬er∩∩@@@AACOJA%SR~∀_∩∩∩@@A≠¬GYSg@A%KM∃aK]Gα)α7πw+π04Ph)↓↓α4(∀T∪';π↔IβCK};Kπ∃π≠Cπ∂(h)↓↓α↓α'→αβS#∃πβ∪A5↓β'7εc↔7↔w#πS'}q↓β?2α6ε∞dJNA1∧⊗rε≡,V
α
xbεn]]wπ

→`hR∧∧ααπ⎇
⊗≡B≡'ε∂≡4ε∞vDλ6}o
_\λ→U-l⎇~;mnh_<LT≤⎇≠n,9C!! Hλ∧∧β"C!X∧w2~w3FEλ⊂⊂⊂⊂⊂P;0y~pq62H⊂6p|H12P⊃_7zw2λ⊂:7P_P;0v≥p¬  by us@∀AWL@↓YCKE⊃BPAaI←NX~(@@@@A←d@↓IV@\%)QJAYCYkJAWLAQQJAm¬eSCE1JASf↓cKhAQK[a←β∪πK'eI1β,ε@hR∧∧ααπ⎇≥FBε,Tαπ⊗↑:F␈⊗\Dπ&@hλ≥
(≤≤L↑X;⎇.∀λ≥X-N9(∃m;Hλ∞M→(≥L≡X88ML(λ~.1"Hλ∧∧λλ]-l[y;LEHHλ∧
;XZ-l~;Yd
_<_→w9P⊂≥t2wλ:42D→4πrm thad bgEnd  the
α     vapiable  iS  exited,  wheTher @9←eKC1YrX@↓Er@A¬\@AKIeWdXA←d@↓Er
∀@@@@↓iQe←\@\4R↓↓↓hP4Ns∪'≠8∧ε≡}nLWGβ"H∧∧λλ∃
(λ⊂M≥Y~3LTλ_p↔[82|:λ⊂1wG≤tqz9H⊂7s⊂λ:42Pλ90v:YyP⊂7Xα  alh	boUnd
     var`∪C	YKf\α↓α6ε≤b&NAαβ';∂e+∪↔M∧∧∩απ≡'&N≥Dε∞⊗≥I↔'J∧
Fzα
\⊗vO∞]F∂&QQ"αα∧∧ε⊗NlM⊗v:9vwε←∞G
α=~Tλ_ ⊗[4yzλ87tg≥2y⊂ &acilIty,	Which  a`→Y=of~∀@@@A	S]IS9J@AG=]iKqQbAi↑AEJ@↓kgKλACf@↓Y@∨;8βπM↓∧∧6}wN-vbα
≡2αεl↑7&.AQ"αα∧∧π∞}\ZvF/,Tπ>OM
⊗rπMVjPQ!P@H!Q$⊗{{⊃,≥H≠p_→y0z4[w9FEλ⊂⊂⊂⊂∪`af$Th⊂4g_v:r2\P0P&ull  q`hAα{⊃α|{#↔πpβ?C↔⊗S'?w→β?9ε∪'SMp↓αS#(h)↓↓α↓↓MYp↓βεαN0O>
_6Bε\≥6*α∞↑αε
∧λfOFn]Rεn∨∀αε⊗T
wε/,≡F."∧	vrε/∀απ&QPRα∧∧ααε-yvf*∧∧ε7∞l:FN}e`α¬&Tαα⊗≥lBb∩∧-wαb$λ⊗v ∀-f␈"$
wε/,≡FN}n4ε}pQ$ααα∧
F}>≤<⊗bπl≥G.<hλ≡Y(_-N{h~-l{≥9\	≥m≡~λλ∧∞λλ≤nL8π24[3P37\⊂:9:YFA⊂⊂λ⊂⊂0w→⊂⊂74[⊂⊂37\⊂30v≤p¬.   A variety of predicate functions, which
     retqrf a  true or	fadcE   i.e*   t   op∧@A]%X@B@↓mCIJα)1↓β∂∪∀4)α↓↓↓βH¬f≡g\LV"pQ!PRα∧∧hPQ(λM};Y⊂≥0y4pX62FEλ⊂⊂⊂⊂⊂Dq7j[2⊂;0\4pq6→Dp	`&↓C\ACQ←[SFAgc[	←XAo!←gJ@↓GkeE∃]hAm¬Y`↔∃π;πL4R↓↓↓↓εGO'>s↔⊃↓¬#=β'"βeβn+π;Mαβ?→βλ∧ε⊗NlM⊗v:d∧∧O"∧
↔4≤{s,↑~~3LT≠~:lT_#"D∧λλλ
Lβqpvλ;0y4Xq22WβE
    

αbreac l@∃mKX~(@@@@↓α∪IKYKXA←_@AG↑αsSK∨bβπQ↓π;#'∂@β∂?7π+Sπ∪L{9↓βFMβ,+9βS.kC?K∂∪'3dhQ↓↓↓αβOWOε+;∪↔ Keβλ↓βK,/C?NsQ↓↓G	;I9Ja↓βπfc?←'v9βSgε+'9↓ε3@⊗}T∧π&FQQ hU≤v*ε≡a⊂HH∀λvf←><↔↔H∀∧ααα∧∧∧∂π-≥Bβ∪eDβvQP@`H⊃⊃∩∧>M}7≡∂/∀ααα↓Q h∩∧∧ααε=yg≡}LUbαε<ebαα∞Mwαα
HW6.EDπ>F↑,PO'≡λ	-≥B:<d;≠≠n|9λλNY{(∧∞~→#!$λλλ∧{{\m⎇→(_L\x=4lT≠[h={<≥.L=~3md~<h
≥H≤≤M||Y<n5C"C!$λλλ↓QC"XN,8:|
⎇;]β!$λλλ∧λ(_\L\:|≠m≥]λλ
≡hλ_$∧≤≠z-nλ~;D∧_(λ∞∞[y|L≥(≥z↑Y(λ={<≥.L=~;mdλ~<aQHλλ∧∧≥→;.
|X<M≥≡(λ∞><|→-l→9λ≥Yλλ={]≤M⎇λ~<d∞Y=≥.-Y9λ∧∞≠h≥
(_{mn{{→%A"Hλ∧∧λ→;L≤[~;Lt≥~→$∞<y<D∞≠h→/∞≠≠|LT≥~→$∞⎇_=T≠yH∞M→(_m⎇<≥=≡~;{Edλ∪;n>β"H∧∧λλ→..[|\dx=<lT_(_N,8:|
⎇;]∧;Yλ∞M→(≥∞,8y(l8z;
≡≡(_l≥H_Y$∞<y9∧∞≠c"D∧λλλ
≥\y<ND_\Y,≥|≠z-n≤kH∧∧⊂(λ∞↑y<H<;B;,≥y(λ∀_\Y,≥|≠z-nλλ≥m≡~λλ∞M→#"D∧λλλn;X⎇
≥{Hλ.Y8:d¬C"C!$λλλ↓QC"Xl≡C"H∧∧λλ∃
(→Z..⎇α;,]8Y<D
yH_$≠⎇≥\λ≤_-≡H≠|D∧_(≠
≡⎇H∧
~→(
l;9(L<Z=L↑c"H∧∧λλ→N-{(λλ={]→-n≤h≠ld⊂9→∞,<|b*,9z<nL<H≠md≥~→$	0S(∧εl∞-¬D≥z→.,(∪∩*:β"H∧∧λλ≥l≡h→Z..⎇λ~-↑≠→;,]]→9¬a"C"D∧λλβ!!"Xx.Lzλ≥≤c"H∧∧λλ⊂-d≠xZL\⎇λ≥m
8zλ
≡h≥<l\λ≥≠d∞Y;_.L"=~∞-⎇h	n4_;Y∧∧_x==λ	y.5C"C!$λλλ↓QC"XlNC"H∧∧λλ∃
(λ≤l\{{Y∧
9;8L↑Hλ≠ld_(λM⎇≥→,D≤_:.%λ≠|A≡~→(∧.Y<⎇∧$λ≠yD(≠~.>β"H∧∧λλ

∃Y+H∧∧_;≠∧
9;8L↑\hλ←_y<∞D≥~→$∧→Z<N>J(∧
~→(∧
X;9$→<Z.l<h→N
{#"D∧λλλλ={]→-n≤h≠l@⊂⊂"2Xy2vr[:⊂)2Ytyz2\⊂7w⊂≥42P$P&P⊂≠L≤Z⊗⊂≥t2y2H&$ihλ;pp∪
     first implemented.

    

character
     One of the 1∩8.   ASCII characterq.  On a Typewriter a character	
     is  represeNted By a  printed mark or by  a foRmatting operation
     such As a Backspace.  InterfAllq achaBacter iay Be rePrese@9iKH~(@@@@↓CfAB↓]kKE∃`XAo!SGPA%`
βSF('πO≤¬⊗Jε=p	T→Sp→λ:42P_t0a0Xz2yελ7y⊂ \P0FEλ⊂⊂⊂⊂_t0a0Xz2y⊂≠q52q]⊂∀8W≥↔∀W⊂λ!t0y_qz2y≤P0q2H0r ∪O use@⊂AS\AA]C[LACMH4∀@@@AS\AMieS]≥f\
∀4∀@@@~∧
∃
QCeC
iKdA=EUKGP~∧@@@Aβ\ACi←5SF@AMs[E←0@AoQ%GP∪ge[E←Y%uKf@↓B@AG!CeCGQKd\@A)QJA]kY0~∀
∃¬aeSXdlX@Drnj∩$∩@A∂1←ggCIr∩α@@@@@↓!COJ↓l~∀_∩∩∩@@A≠¬GYSg@A%KM∃aK]Fα)α7πw+π04Ph)↓↓α↓β∂#∂∪π∂S/⊃β'MαβOg7⊗{3'k.!βeπ##∃β∂#?7'~βGg7⊗{1↓β>C?O∃πβ;π7*β'Mβ|04)↓α↓↓βk/∪=↓βf+;∨SCYβ↔π≡Aβ?→αβS#∃ε{S#↔∩β∂#ε⊗∂S↔↔→β'MαβOg7⊗{3'k.!βe∧84)α↓↓↓β∂#?7'~βOg7⊗{1β←F{O∃βεsπ7∃εKEβSFQβ∂FKπ∂&+I84Ph)↓↓α4(4T≠#πK∞≠S↔I¬#Cπ;≡cπS'}p4)↓α↓↓α¬∧3↔πS,ε&*ε≥dπ&FT∞&.∞L↑"π>
_6Bε≥IF␈?46F∂,≤7&/.4π&h_Y$∞≤X;N=_9→,A Hλ∧∧λ≥≠d
⎇~→.∧_z_.,8⎇→..h≥z]Hλ≥
>(_.,(≤Y,≤α⊂4w⊂⊂#7\α example, pd`-10
     MACLISP usepε@Ai!SfALα+πSW⊗)↓βSzβSKπw≠3π∪*↓β3?>+A7∂∂≠∃β3-#C↔K~↓βS<hQ↓↓↓αβWCC-⊃7∂π≤∧R`h$∧ααQ!PV≡≡'ε␈1Q"αα∧∧¬&FT∧εw.\,W∩α
xbαα=ε∂⊗≤:F/∩∧∞ε␈≡≡M⊗}w4∧ε7⊗⎇Tαπ&Q⊗f.nDαεn≡,vNraQ"αα∧∧∧&/<8M≤Y<h∞M→(≤
}z=~-⎇H≠p∪αz42P≥<x4`.g elEma`≥h↓←\ABαβSgC-;C'S/⊃β?HhQ↓↓↓αβS#∃ε≠WK∂⎇⊃↓β?pβ¬β∪O≠C#εβ∃`M&Tεv␈L≡FN}d
↔4λ→6∞L9Y→,D≥≠hM;→4d
{C"D∧λλλ≥↑(⊃↑pos.   It  is the  number  of
     character positions from the  right  margin.


    
closing a file
     Some  operating systems require a	"cleaning up" operation after
     all  use of a file  has been completed.  This  is called closing
     the  file.  The MACLISP  garbage collector will  usually do this
     automatically.

    

comment
     Comments  are descriptive	text,  not  interpreted by  the  LISP
     system, which are inserted  into programs for the edification of
     a	reader of  that program.  In  MACLISP there  is a  comment 
     function,	which does nothing  with its arguments and  so may be
     used  for comments, but a	better way to write  comments is with
     the semicolon macro character, which makes everything from it to
     the end of the line a comment.  For example,

		(foo (bar x)) ;whizzo the frammis. 


    
Page vi				 Glossary	       April 26, 1975
				 Glossary    

compilation
     Compilation is  a process	which  can be  applied to  a  MACLISP
     function to make it run faster.  The cost of compilation is that
     debugging	is made more difficult.   Generally debugging is done
     by interpretation (q.v.)

    

cons
     A	cons, also called  a dotted pair,  is the basic  unit for the
     construction of data structures in MACLISP.  A cons contains two
     members,  the  car  and  the  cdr,  which	can  be  any  objects
     whatsoever.

    

control characters
     Control  characters are  used  to	tell the  MACLISP  system  to
     perform some action immediately,  no matter what it is currently
     doing.  See section 12.3.



correctable errors
     Most  errors in MACLISP  are correctable.	This  means that they
     cause  a user  interrupt, which either  invokes a user-specified
     function  to correct  the error,  or causes  a breakpoint, which
     allows the  user to determine how to  correct it, inform MACLISP
     of the correction, and continue the interrupted computation.

    

cross reference
     The "index" package may be used to produce "cross references" of
     LISP programs.  See chapter 17.



data types
     In MACLISP,  objects come in several  types, which are explained
     in chapter 2.


    
declaration
     Declarations  are used  to give the  compiler extra information,
     not needed by  the interpreter, which clarifies the programmer's

April 26, 1975			  Glossary		     Page vii
			    Maclisp Reference Manual

     intent and  makes	possible the  compilation of  more  efficient
     code.  The function  declare  is provided for this purpose.


debugging
     Debugging	is the	usually long  and painful  process of finding
     mistakes (bugs) in programs and removing them*  MACLISP provides
     a number  of tools  to assist  in debugging.   See errors,  user
     interrupts, baktrace,  breakpoints, trace, the  *rset  switch,
     and interpretation.



display slave
     The "display slave" Iq part of the Moby I/K facility in MACLISP.
     When the pdp-10 implementation  of MACLISP is running on the MIT
     A.I.  Lab pdp-10, the display  slave may be used tk display text
     and graphics.  ExtensiOn of the display slave to other sites and
     implementations is anticipated.



do loop
     A clear And  concise notation for iterative algorithms, provided
     by the  do  function iN MACLISP.



dot notation
     A	notation in which  a Dotted pair is  written with parentheses
     and a period.   A dotted pair whose car is a  and whose cdr is b
     is written:

			      (a . b) 

     Any structure of dotted  pairs can be written unambiguously, but
     not necessarily clearly, this way:

		     (((a . b) . c) . (d . e)) 
    

dotted list
     A structure which would be a list except that it doeq not end in
     nil.  It  is  written  in a  hybrid  of  dot notation  and  list
     notation.	For example:

			   (a . (b . c)) 

Page viii			 Glossary	       April 26, 1975
				 Glossary    

     would be written:

			     (a b . c) 


dotted pair
     See Cons.

    

edit
     The  pdp-10  implEme`≥i¬iS←\↓←L@A1∪' @↓G←]i¬S]f@↓C\@AL[KqaIKggSα{84)α↓↓↓β.#'S?∩aβ∪↔≡≠C'. ''9∧≠#πC&+I↓↓A1↓α&C∃↓αo+3S'∨→↓β'oβ3↔7.sSπSL{84)α↓↓↓β&{↔M↓εs?Qβπ∪↔O↔w#3e↓εCπ[∀N	↓β,¬⊗gαβ:;D9~=
}Kλλ

⎇y=L↑Hλ≤l↑Y<X-A ¬⊂⊂λ⊂⊂2r~z7y9K⊂;y4]82w~w⊂&$Th⊗⊂ %xist.
¬

    
¬
End-oF-file
     When an input file is being pead, eveNtually it comes to The e@9H~∧@@@AC9HAg←5J@AgAKGSC0ACGi%←\A[¬rAQCYJAi↑AEJAAKeM←I[CH\A'KJ↓gKGi%←\~∀@@@@Df\d\P\~∀~(@@@@4∀~∃K9IaCO∃M\~∀@@@A∧AMk]
iS←\0@ACgβ≠?∂'∂#↔⊃β>KS!β.∂!β␈+SCW"↓β≠'f)1β←FK∂!βO→β';6{/↔⊂hQ↓↓↓αβ←#↔v+[↔I∧	β;↔:βCπ∨*β?→β␈+SCW"β'Mβ∨#πKS.!84(hQ↓↓↓h(4+.s['K}s7↔; h)↓↓α↓α∧&dJNAβ.s['K}s7↔;"↓β∂?w≠'OS~↓β?_N	β∂?oβ3↔S*↓βO↔"↓β?→αβ?+.≠SM0hQ↓↓↓αβ[πKN3∃π3π3W/→1β≠.s∂S'}qβ∪↔4K;'SN{;M1∧;⊃β6K3↔Mbβ←#'≡AβS?>+S#↔⊂h)↓↓α↓β7π↑)βWAε9βππβ3'∂∂#'?9π≠gOS.iβ?I∧	βWO/⊃∨Mβ∨+KK↔w!β←?⊗Y9↓α≡+∂S'}p4)↓α↓↓↓E∩qa9Mε#↔O∂⊗K↔Mπ;πgMπ#=↓β≡[∃β&C∃β∂/∪K↔;"β↔;[M∪?;7.sQβπv!β3π&+H4)α↓↓↓β⊗+OW7*β←?K↑K;≥β>KS!βO!84(hQ↓↓↓h(4+.{≠≠8hQ↓↓↓αα∧'≠.s∂S'}q1βπ≥≠?∂'∂#↔⊃β>KS!↓ε+π∂!εK;CW"β∪'3*a↓β←FK∂!βO→β';6{/↔⊂hQ↓↓↓αβ←#↔rβπ9β∂#S↔7π!β'Mεkπ∪∃π#=↓β⊗+π↓βεOQβ&C∃β↔v!β?→π##∃β&S¬βL¬bπ&QPRα∧∧αε6≥LRph!Q hR∧∧αh(≡π⊗NDε#2bε↔∪;(⊃⊃∩α∧⎇Mw>x<↑!⊃(λλ∧∧λ∀_,|(~6↓Q@↓A""(∧∧λ∪8,=~<|∧
Y9Q.;Xy$	8;],≥β"C!,<#"D∧λλλ∧<(λ∧
<h_$];XnM;{H∧[|H={<_.-;Yh∞N{hλ
|ZY8nNkλ≥m
8zλ∞,=≥<Mnc"H∧∧λλλ∞Dλ~9D∞~→>$<Y(={<≠↑tical,  nil  if they are not.
     (In machine terms, completely identical means they have the same
     storage  address.)    eq	is  not  defined  for  numbers	and
     strings.  cf.   equal .

    

equal
      equal  is a function for comparing two objects, which returns
      t   if they  are similar,  nil   if they	are not.  Similar
     means  approximately that	they would  look the  same if printed
     out.   equal   works  for numbers	and strings:   numbers	are
      equal  if  their values  are numerically	equal, strings	are
      equal   if they contain the  same characters.  Atomic symbols
     are   equal   if  they  are   eq .   Two  dotted  pairs  are
      equal   if  their  cars are   equal   and  their	cdrs  are
      equal .

    

errors
     Handling of  errors in MACLISP is	very flexible, in recognition
     of  the fact  that errors	are a  major tool  in debugging.  See
     section 12.4.

    

escape
     See altmode.

    

evaluation
     The process  by  which a  form, which  may  be almost  any  LISP
     object, is  made to  produce a  value.  Evaluation  may  involve
     taking  the values  of variables  and applying  functions when a
     function call  is indicated by a list as  a form.	Evaluation is
     explained in detail in chapter 3.

    

expr
     An expr is an interpreted function which takes a specific number
     of evaluated arguments.

    
Page x				 Glossary	       April 26, 1975
				 Glossary    

fail-act
     A catch-all  category of  errors, which  cause a  breakpoint  to
     occur.  The  atom	args  is bound	to useful information about
     the error.

    

fexpr
     An interpreted  function which  implements a  special form.   It
     does not receive the regular type of evaluated arguments.



file
     A sequence  of characters	in the	external world,  and also  an
     object within the lisp  environment which is used to communicate
     with that sequence of characters.	See chapter 13.


file name defaults
     There is  a system of defaults for file  names which is intended
     to  increase the  convenience  of	users and  programmers.   See
     chapter 13.

    

file object
     An object within the LISP environment which symbolizes a file in
     the outside world.  See file.

    

fixnum
     A fixnum  is a  type of  number, specifically  an integer	whose
     absolute value is	less than some machine-dependent maximum.  In
     the pdp-10 and Multics implementations, this maximum is 2**35-1,
     or 34359738367.   Compiled code  can perform  fixnum  arithmetic
     very efficiently.


flonum
     A flonum  is a  type of  number, specifically  a  floating-point
     number, similar to  REAL in FORTRAN, which has machine-dependent
     range and precision.   In the Multics and pdp-10 implementations
     the range is about 10**-38  to 10**38 and the precision is about
     8 decimal digits.


April 26, 1975			  Glossary		      Page xi
			    Maclisp Reference Manual

    

flow of control
     The logical  sequence in which parts of  a program are executed.
     This  includes  decision,	recursion,  iteration,	and  function
     calling.  In LISP flow  of control is generally linear except as
     otherwise	 specified,  except   that  the   use  of  functional
     composition causes  the arguments to a  function to be evaluated
     before the  function.  The functions  cond,  and, or, do, prog,
     go, throw,   and  return  are among  those functions used for
     their effect on the flow of control.

    

form
     A form is an S-expression which is intended to be evaluated.  It
     may be  an atomic symbol, an  atom such as a  string or a number
     which  evaluates to  itself, or  a list  of forms,  the first of
     which  is a functional form  and the rest of  which are argument
     forms.

    

formatting
     The grind package may be used for the formatted printing of LISP
     functions or data.  See chapter 16.
    

free storage
     In  the pdp-10 implementation  of MACLISP, free  storage is that
     part of memory set aside for various types of LISP data objects.
     In  some versions the size  of this area must  be specified when
     LISP  is first entered.  The  free storage area is  managed by a
     garbage collection algorithm.

    

free variable
     A free variable is an  atomic symbol whose current value was not
     determined by binding  within the currently EvaluatingfuncTion.
     Either  it has a global  value or it was  bound in some function
     which then cAlhed the current function.

    
	
fsubr
     An  fqubr is  a  machine-lafguage	@→k]Gi%←\Ao!SGP∪%[aYK5K]ifAB~∀4∃!CO∀AqSR$∩∩A∂1←ggCIr∩@@@@@A¬aeSXdlX@Drnj~(_∩∩∩$A∂Y←MgCer@@@~(~∀@@@Aga∃GSCX↓M←eZ8@A/Q∃\ABA→KqadASfA
←[aS1KHASPAEKG=[KfA¬\AMgUEd\@↓α~∀@@@A]U[EKd↓←LAi!JAEk%YiS\↓Mk]GQS←]f0AgkG ACf@↓G←]HXACe∀AMgk	ef\~(~∀~∀4∃Mk]¬eN~∀@@@A∧AMk]
iS←]¬XAM←IZXAa¬ggKH%CfAC8ACeOU[K]h↓kgkC1YrXA]QSGP↓GCee%Kf~∀@@@A]SiPA%h@AB↓a←S]QKdAi<AiQJ%ES]I%]NAG=]iKqPAS\A]QSGPAShA%fAi↑↓EJ~∀@@@A¬aaYS∃H\@AMKJAi!J∩UMU]GiS=\@AMU]GiS=\\~∀4∀@@@~∀~∃→k]Gi%←\~∀@@@A∧A→∪'@@A←E)KGhAMkSiC	YJ@A→←dACAaYSG¬iS←\8∩A∂SYK\ACIOk[K9ifX@↓Sh~∀@@@AAKeM←I[fAg=[JACIESie¬erAG¬YGkY¬iS←\↓C]HAIKike9fAg←5JA→∪M A←E)KGh~(@@@@↓Cf@A∧@AmC1kJ\@@A
k9GiS←9f@ACIJ@Ai!J@AMU]IC[∃]iCX%G←]iI←X@@!C]H~(@@@@↓gs]i¬GiSF$AgieUGike∀AS\A1∪' \4∀~∀@@@~∀4∃Mk]
iS←]¬XAM←IZ~∀@@@Aβ9rA&[∃qaeKMgS←\AoQS
PAGC8@AEJ↓kgKHACfA∧@AMk9GiS←8\@@A!←oKm∃dX~∀@@@A=MiK\↓iQJ∪QKeZ@EMk]
iS←]¬XAM←IZD@A%fAeKMKemK  for  non-atomic
     functions,  such as lambda-expressions, labels,  or random forms
     which are evaluated to produce a function.


    

garbage collection
     The basic memory  management scheme of all LISP implementations.
     Objects are  retained until there are no  references to them, at
     which time since the object  can never again be used the storage
     it occupies can  be reclaimed.  Reclamation (garbage collection)
     occurs periodically  when the system decides it  would be a good
     thing to do.

    

gc-daemon
     A user  interrupt which  occurs after  each garbage  collection,
     allowing  a user-specified function to  gain control and monitor
     the program or make decisions based on the efficiency of storage
     usage of the program.


gensym

April 26, 1975			  Glossary		    Page xiii
			    Maclisp Reference Manual

     An  atomic symbol which has  a unique name of  the form  g0001,
     g0002,   etc.   gensym 'ed atoms are  not "interned," so they
     cannot  be referenced from  the console.  They  are generated by
     the function  gensym .

    

global variable
     A variable  which does not currently have	a local binding.  Its
     value  is whatever value has  been assigned to it	in the global
     binding context, for instance  if it has been  setq 'ed at top
     level.

    

grind
     A package	for printing LISP functions and  list structure in an
     indented form that is easy to read.  See chapter 16.

    

ibase
     The value	of  the  variable  ibase   is  the radix  in  which
     numbers read  by the reader will be  converted.  It is initially
     8.


    
index
     A cross-referencing package for LISP programs.  See chapter 17.

    

indicator
     An  atomic symbol (usually) which	serves to label an  item in a
     property list.


    

input source
     The file from which input is taken, when no source is specified.
     Determined by the variable  infile .

    

integer

Page xiv			 Glossary	       April 26, 1975
				 Glossary    

     A type of number which can be represented in MACLISP by either a
     fixnum or a bignum, depending on how large it is.

    

intern
     When  an atomic  symbol is  read in, it  is placed  in a special
     table  called the obarray;  this is called  interning the atomic
     symbol.  The obarray allows  the same (according to the function
      eq ) atomic symbol to be used the next time the same pname is
     read.

    

interpretation
     A method for executing  LISP programs in which S-expressions are
     processed	 by  an  interpreting	program  without  preliminary
     translation.  This is the	usual mode for execution of lisp.  It
     is more efficient	than compilation (q.v.)  for evaluating once-
     only  expressions	such  as directly  typed-in  input,  and  for
     debugging.


    

I/O
     Input/Output, or  communication between  LISP programs  and  the
     outside world.  See chapter 13.



iteration
     See do loop.


    
label
     1) see prog tag.
     2) a type of functional form.

    

lambda
     lambda-expressions are  the  most	common type  of  (non-atomic)
     functional  form.	A  lambda-expression  is  written as  a  list
      (lambda ( <vars> ) <body> ) .

    
April 26, 1975			  Glossary		      Page xv
			    Maclisp Reference Manual

lambda-variables
     Variables	bound  in  a  lambda-expression  are  called  lambda-
     variables.

    

lexpr
     An  interpreted  function	which  takes  a  variable  number  of
     evaluated arguments.  An expr  with an atomic symbol in place of
     the lambda-variables list is a lexpr.

    

linel
     The number of character positions per line.
    


linenum
     The line number, starting from 0  at the top of the page, of the
     current input or output position in a file.

    

LISP
     A language for list  processing and manipulation of symbolic and
     structured   information.	 The  MACLISP  dialect	 of  LISP  is
     described in this manual.



list
     A data  structure in LISP, composed of  several conses.  The car
     of each cons  is a member of the list, and  the cdr of each cons
     is the next  cons, except that the cdr of	the last cons is nil,
     which marks the end of the list.

    

list notation
     A	more concise form  than dot notation for  writing lists.  For
     example,

		       (a . (b . (c . nil))) 

     is  (a b c)  in the list notation.


Page xvi			 Glossary	       April 26, 1975
				 Glossary    

    

load
     Loading  is  the	process  of  bringing  function  definitions,
     variable  values,	atomic	symbol	properties,  etc.   into  the
     current LISP environment from an outside source, such as a file.
     See the  load  function.



looping
     See do loop.


lsubr
     An lsubr  is a machine-language function  which takes a variable
     number of evaluated arguments.  A compiled lexpr is an lsubr.  A
     number of the builtin functions, such as  plus , are lsubrs.


    
macro
     A type  of function which produces as its	value a form which is
     then  automatically evaluated to  yield the final	result of the
     function call.



macro character
     A macro  character is  a character  which, when  read, causes  a
     function to be invoked.   Macro characters are used to implement
     complicated special input syntax.	The ' character is an example
     of a macro character.
    

mapping
     A type of iteration in which a function is applied to successive
     parts of a list.  See chapter 10.



moby I/O
     A feature	in  some versions  of  the pdp-10  implementation  of
     MACLISP  by  which  various peculiar  hardware  devices  may  be
     manipulated by LISP programs.



April 26, 1975			  Glossary		    Page xvii
			    Maclisp Reference Manual

    

namelist
     A list  of atomic symbols which specifies the  name of a file in
     the form of multiple components.

    

namestring
     A	character string  which  specifies  the  name of  a  file  in
     implementation-dependent format.

    

newio
     The I/O system described in chapter 13.  Some LISPs still use an
     older  I/O system	which is  less general,  described in section
     13.5.

    

newline
     The  character  or  sequence of  characters  used	in  the  host
     operating system to indicate the separation between lines.

    

 nil 
     An atomic symbol which is used for expressing lies (cf.   t .)
      nil  indicates "false," "default," or "end of list."   nil 
     is a constant since its value is initially  nil  and cannot be
     changed.

    

non-local exits
     Escaping  from nested  function calls without  going through the
     normal function-return mechanism.	See  catch  and  throw .



number
     See fixnum, flonum, bignum.
    

obarray


Page xviii			 Glossary	       April 26, 1975
				 Glossary    

     A table of interned atomic symbols, used by the reader to insure
     that  each time a	pname is typed in  it will refer  to the same
     (according to the function eq) atomic symbol.



object
     Any piece of data used by LISP.  Programs are also objects.



octal
     The  number  system  used by  MACLISP,   unless  some  other  is
     specified.  Fixnums  and  bignums are  converted for  input  and
     output in	octal (base  8).   Note that  flonums are  always  in
     decimal.
    


opening a file
     Creating  a file object so  that a file in  the outside world is
     usable by LISP.

    

output destinations
     Those  files to  which output  is sent  if a  destination is not
     explicitly specified.  The value od the variable  outfiles  is
     a list of the output destinations.
    


pagel
     The number of lines per page in a file.

    

pagenum
     The current  page number in a file, starting  with 0 at the tima
     it is opened.



pdl
     Pqsh-down	list or  push-down stack.  MACLISP  uses several @AIYf~(@@@@↓S]iKI]CYYdAM←d↓ES]I%]NAC9HAeK
kegSYJAKm¬YkCi%←\\~(~∀~∃¬aeSXdlX@Drnj∩$∩@A∂1←ggCIr∩∩@@@A!¬OJAq%p~∀_∩∩∩@@A≠¬GYSg@A%KM∃eK]G∀A≠C]UCX~∀4∀@@@~∀~∃AIXA←YKeMY=n~∀@@@A!⊃XA←m∃eMY←\@ASf↓oQCh↓QCaa∃]fAo!K\AB↓IKai @A←L↓eKGkIgS←\↓SfAkMKH~∀@@@AQQChA%f@A[=eJAi!C\Ai!JAS[AYK[K9iCiS=\@AG¬\AQC9IYJ\A∪hA≥K]Ke¬YYr~(@@@@↓S]IS
CiKf↓C\AKIe←d\4∀~∀@@@~∀4∃aIX↓a←S]QKd~∀@@@A∧AMSq9kZ@A]QSGP↓S]IS
CiKf%B@Aa¬eiSGUYCdAA←S]hAS\A∧@AaI0\@@AAIX~∀@@@AA←S]i∃ef@A¬eJAkMKH@AQ↑AIK9←iJAACeiS
kYCdAaK]⊃S]NA∃mCYk¬iS←]LAS\~(@@@@AKmC1MeC[∀@AC]⊂AeKY¬iKHA⊃KEkO≥S]NA→k]Gi%←]f\4∀~∀~(@@@@4∃a]C5J~∀@@@A)!JAa]¬[JX@↓←dAaIS]h[9C[JX↓←LAC8ACi←5SFAge[E←XASfA∧AgKcUK]GJ↓←L~∀@@@A
QCeC
iKef↓oQSG ACeJ↓isaK⊂AS\A=dA←kPAi↑A⊃K]←i∀AiQCPAgs[	←X\~(~∀@@@~∀~)aeKI%GCiJ4∀@@@AαAMU]GiS=\@Ao!SGPAQKgifAiQJ↓ieki @A←d↓MCYg%ir@A=LAB@↓aCei%GkYCH~∀@@@AG←9ISiS=\X@AIKike9S]N@↓h@AS_@ASh↓Sf@AQekJA=d@A]%X∩AS_AShA%f~∀@@@AM¬YgJ\4∀~∀~(~∃ae%]YK]≥iP~∀@@@A∧AmCe%CEYJ↓oQSG AGC\↓EJAg∃h@Ai<AiQJ↓[CqS5kZA]U[EKd↓←LACQ←[fA%\AB~(@@@@↓YSghAiQCPAoSY0AEJAAeS]i∃H@AE∃M←eJ↓iQJAAeS]i∃dAoS1X@AO%mJAk@AC]H4∀@@@Aakh@@D@8\\@D@A∨a∃eCiKL@Ak]⊃Kd@AQQJ@@↓G←]iI←X@A=L@@@!ggiCQkf~∀@@@A¬EEeKYSCiJ$@\~∀4∀@@@~∀~∃AeS]Y∃mKX~(@@@@↓αAmCISCEY∀AoQS
PAGC8AEJAMKhAi<AiQJ↓[CqS5kZAI∃aiPA=LA]KMiKHA1Sgif4∀@@@AoQS
P@Ao%YXAE∀AaeS9iKHA	KM←e∀@AiQ∀AaeS9iKdA]SYXA≥SmJ@↓k`AC9HAakP~∀@@@@D@@D\∪=aKeCQKf@@↓k]IKH@@Ai!J∩@A
←]ie=X@@A=L∩@@!ggiCQkf~∀@@@A¬EEeKYSCiJ$@\~∀4∀~∀~)ae←N4∀@@@AαAaI←N@A%fAB@↓→∪' ↓M←eZAECg∃HA←\%iQJA→k]Gi%←\@@↓ae←N@AoQ%GP~∀4∀~∃!¬OJAq`∩∩∩∩↓∂Y←gMCer∩@@@@Aβae%X@dl0@brnT~∀_∩∩∩$A∂Y←MgCer@@@~(~∀@@@ACY1←of@↓BAG←9ie←X↓giek
ikeJ↓←L@AMKckK9iSCX↓giCi∃[K]iLAC]H↓O←i←LX~∀@@@Ae¬iQKd↓iQC\↓G←[a=gKHA→k]Gi%←]fX↓i↑AE∀AkgK⊂\~∀@@@~∀4∀~∃aI←NAi¬N~∀@@@Aβ8ACi←4AoQS
PAiC≥fA←d↓YCEK1fABAACeiS
kYCd↓giCi∃[K]h↓S\AB↓ae←N↓g↑~∀@@@AQQChA%hAGC8AEJAIKMKeIKHAi<AoSi AiQJAO↑@↓Mk]GQS←\\4∀~∀~(~∃ae=NAmCISCEY∀~∀@@@AαAYCeSC	YJ@A]QSGP↓SfAE=k]HA	rABAAe←NvAKCG Aae←≤AG←]QCS]f↓BAYSMh~∀@@@A←_@Aae=NAmCISCEY∃fAoQ%GPACIJ@AE=k]HAQ↑@A]%X@Ao!K\∪i!JAae=NASf4∀@@@AK]i∃eKHA¬]HAG¬\AEJ↓kgKH↓CfAi∃[a←e¬erAm¬eSCE1KfAo%iQS\↓iQJAAe←N\4∀@@@~∀~∀4∃ae←AKeir4∀@@@Aβgg=GSCi∃HAoSQPAKC
PACi=[SF@↓gs[E=XACe∀Aae←AKeiS∃fXAo!SGPA
C\AE∀~∀@@@AC]dA→∪'@@A←E)KGh\%CGPAae←AKeir↓Sf@A9C[KH↓Er@A¬\@@E%]ISG¬i←dXλ~∀@@@AoQ%GPASL@AUkMhAC\↓Ci←[%FAgs5E←XAUgKHAQ↑@Ae∃MKdAQ↑AiQ¬hAae=aKeid\~∀@   Thus  we would  refer to  the " fsubr   property" of  cond ,
     which  has the  atom  fsubr  as  indicator and  is an internal
     pointer to the machine code for  cond .



property list
     The  list of indicators and  properties kept on the  cdr of each
     atomic symbol.



quote
     A	special function which	is used to prevent  the evaluation of
     arguments	to other  functions.   (quote a)   evaluates to the
     atomic symbol  a , while  just  a	evaluates to the value of
      a .   (quote a)  is usually abbreviated  'a .


readtable
     A table  which specifies the lexical  significance of each ascii
     character.   The readtable is  used by the  function  read  to
     direct the  parsing of input.  It can be  altered by the user to
     implement special	extensions to LISP syntax or  to allow use of


April 26, 1975			  Glossary		     Page xxi
			    Maclisp Reference Manual

     the  read	function  to lexically analyze languages other than
     LISP.  There  can be more than one readtable;  at any given time
     the one  that is used is  the one that is the  value of the atom
      readtable .

    

recursion
     See recursion!

    

roman
     An  obsolete number system supported  by some implementations of
     MACLISP.


    

rplaca
     Changing the  car	of a  previously-existing cons	to  something
     other than what it was originally created as.  All references to
     that cons will find that its car has been changed on them.  This
     operation has hidden dangers and should not be used lightly.

    

rplacd
     Changing the  cdr	of a  previously-existing cons.   Similar  to
     rplaca.


    

S-expression
     Another name for "LISP object."

    

single character object
     An atomic symbol whose pname  is a single character is a "single
     character object"	if the syntax of that  character has been set
     so that the character reads  in as a seperate atomic symbol even
     if it is not surrounded by spaces or other delimiters.
    

slashify

Page xxii			 Glossary	       April 26, 1975
				 Glossary    

     "Slashifying" a  character is  preceding it  with a  slash  (/).
     This  can	be  done  to special  characters  such	as  space  or
     parenthesis to indicate that  they should be treated the same as
     alphabetic letters and their special meanings should be ignored.
     Slashification is	the convention	by which  pnames may  contain
     these special characters.



sorting
     MACLISP includes a generalized  sorting facility.	An array or a
     list  of objects can be  sorted if a function  can be written to
     determine,  for any pair  of such objects, which  is the lesser.
     See chapter 11.
    


special array cell
     Some MACLISP implementations use "special array cells" as values
     of array properties.   These cells are communication words which
     allow the array to be addressed by both compiled and interpreted
     code.

    

special form
     A form which is not evaluated in the usual way.  See chapter 3.
    

stack
     "stack" is synonymous with "pdl," q.v.

    

string
     One of  the MACLISP  data	types is  the string  of  characters,
     written  "foo" .
    

subr
     A subr is a machine language function which takes a fixed number
     of evaluated arguments.  When  an expr is compiled, it becomes a
     subr.  A number of  the builtin functions, such as  memq , are
     subrs.   Occasionally the	term  subr  is used  to  include  all
     machine executable functions, fsubrs  and lsubrs as well as true
     subrs.


April 26, 1975			  Glossary		   Page xxiii
			    Maclisp Reference Manual

    

subr object
     The value	of a  subr ,  fsubr ,  or  lsubr  property.  In
     some implementation dependent way,  a subr object tells lisp how
     to get  to the  machine  language function  given its  name  (an
     atomic   symbol  with   a	 subr ,    lsubr ,  or	 fsubr 
     property.)

    

substitution
     One S-expression  may be substituted for  another within a third
     by using the functions  subst  and  sublis .  See chapter 4.


    

switch
     A "switch"  is an	atomic symbol  whose value  is by  convention
     either   t  or  nil , representing  on and off respectively.
     There are a number of switches which affect the operation of the
     lisp system.

    

symbol
     See atomic symbol.

    

syntax
     See readtable.



t 
     An atomic	symbol	which is  used	for expressing	truth.	 Like
     nil , it is a constant because its value is always itself.

    

tag
     See prog tag, catch tag.

    
terminal

Page xxiv			 Glossary	       April 26, 1975
				 Glossary    

     MACLISP   is  almost   always  used  interactively   by  a  user
     communicating  with it  through  a  terminal.  The  phrase  "the
     terminal" or "the console" is  used in this document to mean the
     particular  terminal which is controlling	the computation under
     discussion.
    

time
     MACLISP  keeps track  of two types  of time.   "time" is elapsed
     time  in seconds,	since some arbitrary  event such  as the last
     time the  computer system was started.   "runtime" is the number
     of microseconds of CPU running time that has been used.
    

top level
     The level of recursion which lisp is at when first entered.  The
     user at  his terminal is in control.   Lisp will accept typed-in
     forms, evaluate them, and print the results.


trace
     A package for debugging LISP programs which allows control to be
     seized   whenever	specified  functions   are  called.   Various
     operations to  be performed,  such as  displaying of  arguments,
     examination of  specified variables,  and temporarily  returning
     control to the console via a breakpoint.  See chapter 15.
    

truly worthless atom
     An atomic	symbol which is not referenced	by any list structure
     other than  the  currennt	obarray, has  no  value, and  has  no
     properties.  In  most  cases  no one  would  notice if  a	truly
     worthless	atom was  removed from the  environment and recreated
     when someone  later referred  to its  pname.  Therefore  MACLISP
     provides the  gctwa function  which can  be used  to direct  the
     garbage  collector  to  remove truly  worthless  atoms,  in  the
     interests of saving memory.


type
     See  chapter 2 for  a description	of the builtin	data types in
     MACLISP,  and a  list of predicates  for type-checking.  Numeric
     type-conversions  can  be	done with  the	functions  listed  in

April 26, 1975			  Glossary		     Page xxv
			    Maclisp Reference Manual

     section 7.1.3.   Other type conversions can be  done with a host
     of  functions  listed  mostly  in	chapter  13.   The  user  may
     efficiently  define new data types  simply by defining functions
     to manipulate them.

    

type checking
     See section  2.1 for a list of predicates	which return  t  if
     their argument is of  a specified data type.  In the interpreter
     most  functions automatically check their	arguments for correct
     type, but	in compiled code  types are  usually assumed  tk  be
     coprect, and  if they  are not,  the internal  mechanisms	which
     support MACLISP may be damaged.


    

unbound variable
     A variable  which has no value  is called "unboend."  Attempting
     to evaluate such a variable widl cause an epror.
¬
    

usEp interrePts
     The user interrupt  facilIty allh∂of↓BAkg∃`[ga∃GSMSα+⊃β≠,s∂S'|qβS<hQ↓↓↓αβ↔π'pβ∂?;'∪?1↓∧εvF.dλ∩π∨X&N⊗α99∧{{Y
≡~;{D∧≠xpn↑\kλ
mh≠8.N→<H∞⎇_0
εB⊂⊂⊂⊂λ2r9BH4p|P_2P40\82w4[3P⊂∀→|1r@0t that reSponsE to @∧AcgKβ⊃β';&+CKWπ $)↓α↓↓β7∂Iβ∃αβ∪↔3∂K↔⊃↓∧εvFNLTε.∂,,⊗.
∧λ6}fL\7&N⎇`πε∞αq →H⊂86 XrW∀Dλ*yr`2	α     interbe@Aif@A¬aJAkMK@AM=`	β↔↔∪?I↓∧ε&.≡|¬Y.8V⊂ [0p∩mclh∂GVαβS'↔(ε'
B≥f H ∧ααα∞,V∞b↑M⊗n 0Y.x7w9YP:7P≥42P"[:9<Pλ7s⊂ #ertain "atteftion getp	S]≤@α(α↓↓↓β≤¬ε∂⊗≤:F/⊗4λ	N5vP 4he tep¬@↔≥l⊗br∧
6.
∞<V∨&≥ybβ%`
∧[|@⊂→2z0t[9SεEβ@
    	∀~)kk@<hQ↓↓↓αα≠?I∧¬εO∨Mz&N≡≥Dαπ⊗\≡6}w5Dπ&FT
F/⊗β(λN↑;`@⊂~yP⊂:\rr⊂4o deScrabe the
λ     direct  @1S]@/∞;∃β-#←↔↔p↓β∂?oβ'3↔ ∧ε␈∩λλ]-≥≥~;D∧→]3L>~;sN∀≥z~,=λ~4aQHλλ∧∧≥<q,Dλ≥≠d
9Xp→→pyrD]42P⊂→s34`#iafC@d@A←L↓I`↔:≤εFN}d∧ε≡∞MI⊗v:a∀¬&F≤1PRα∧∧αεf≥m6∞≡T∧ε.f≥]⊗v∞L↑2π&Tεv.<Z7≡OM∀π&hλ∀l\<Xr∧∞≤[|↑]_P≠4yz9H2pqtβA⊂⊂⊂λ⊂:4fYP⊂0@ `¬c@:_εFN}d	↔4_p;
9λλ∞⎇→0↔ both↓aQJA
CYYKβ⊃↓βπv!βC#*β∂π∪d∧V(h ∧ααα≡&*α
\⊗≡F≥lRε@_;Yn\9y(∧¬_p↔@-pi`→K⊂AWdAα∪W'H¬~-e(λ⊃N↓w1z4[w9W  A`≤Aβ##∀Q$ααα∧λNλε@1⊂  impleeE9iC@SL¬vrε|d∧l9I∃≥αβ:~4yP⊂~∧i`≥↔¬H∂*	⊂d8x`↔≠x64@3hed
     bq @Bαβ .8r_-m<{ ⊂≥t4q`( i`≥εεc@.→<h∞
→(⊂~\β`
A↓xb¬-YtεNw>N'\⎇~ ↔[9P↓!KUG
4⊂	↓↓α↓β@&λTαπ→<[$∧]=0↔α"  Note QQCH↓aQJ@α3@.v>M⊗}pα"≤nz0`∀upεAkkαs#'h
|e∀β"@∧∧λλ⊃Xu⊂!2H⊂:y`%d to`reAk p	Q∩β→β&≥m6∞y+0∂r examphe s@<A`∪#∂!β@',≤&NvqQ"αα∧∧εN∂∀∧ε⊗*∧
.p¬d∞@@A_∧@.Nα4w3Bz4"Pλ8εa@%%CE@3(@⊗v@⎇=0↔Bw0∂n4A@≠≥DH↓Hλλ∧∧≤≤Y.l8π:9H8∧he h	S@:¬<⊗ <αP &↓I←RA¬∃S]N↓∧G>_8[
≡x⊃ 2λ4p∞ @QQJAεK@↔∨@λ
↓0qbWαA

λ∧@@@⊂∀U≤v*εα≡≥M⊂ ∧D@⊃t7`∪∪arq	       April 26, 1 ∩nT∩∀_∩∩∩$A∂Y←MgCer@@@~(~∃mC1kBAG∃YP~∀@@@AQQJ@AYCYkJ↓GKYX↓Sf@AQQChAACehA=H@AC8ACi←5SFAge[E←XAS\A]QSGP↓Sif~(@@@@↓mCYk∀ASf@↓WKah8@A∪\↓c←[J↓S[aY∃[KMi¬iS←]LAiQJAmCYUJAGK1XASf↓WKah4∀@@@A←\A∧@AmC1kJ@AAe←aKIirXA	kh@A%\A←i!KefA%hASf↓WKah↓S\ABEQSI⊃K\D~(@@@@↓GKYX↓oQSG @ASf↓Cgg←
SCiK⊂∪oSi @AiQ∀ACi←5SF@AMs[E←0AC]HASf@↓]←h~(@@@@↓CGGKMgSEY∀AKqG∃ahAi<AgKh↓←dAO∃hAiQ∀Ags[	←XOf↓mCYk∀\~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∀~∀4∀~∀~(~∃βaISX@dXX@br\j∩∩∩A∂Y←MgCer$∩@@AACOJAaqmSR4∀_~∃∪9ISGKL@\@\\@\@8@\@\\@\@8@\@\\@\@8A'←kIGJtA5βπ→∪M A≠C9kCX@@f↑`l<nl~∀4∃
k]
iS←\↓∪]IK`\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\]∪∩]$∩@@@4∃βi←4A∪]I∃p\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\↓∪∩]∪$∩@@~)π←]G∃ahA∪9IKp@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@\@8@\@\\@]∪$]∪∪∩$@~∀~(∩∩@A%∩]∩∩A
k]
iS←\↓∪]IK`~∀~∀4∀T\@8@\@\\@\@8@\@\\@\@8@\@\dZnhA→'+	$@`A=dA[←IJACe≥f~∀T⊂@\@\\@\@8@\@\\@\@8@\@\\@dZ\h@A→M+¬$@@A←dA5←eJA¬eOf~(UCee¬r@\@8@\@\\@\@8@\@\\@\@HZrh@↓→'+¬H@fA←HA[←e∀ACeOL~∀UI%L@\@8@\@\\@\@8@\@\\@\@8@dZnH@A'+	$@dA¬eOf~(UMk]
iS←\8@\@\\@\@8@\@\\@\@HZr@@↓
'+¬H~∀UcU↑@\@8@\@\\@\@8@\@\\@\@8@dZnL@A'+	$@dA¬eOf~(UeKCIeCr@8@\@\\@\@8@\@\\@\@HZrj@↓→'+¬H@bA←HA[←e∀ACeOL~∀V\\@\@8@\@\\@\@8@\@\\@\@8@dZnP@A→'U¬$@`↓←dA[=eJACIOf~∀,H@\@8@\@\\@\@8@\@\\@\@8@\@d4nn@A1'+¬$`A←d↓[←eJ↓CeOf4∀Z\@8@\@\\@\@8@\@\\@\@8@\@\dZnhA→'+	$@`A=dA[←IJACe≥f~∀Z⊂@\@\\@\@8@\@\\@\@8@\@\\@dZ\n@A→M+¬$@@A←dA5←eJA¬eOf~(↑\@\\@\@8@\@\\@\@8@\@\\@\@HZnj@↓→'+¬H@`A←HA[←e∀ACeOL~∀↑H\@\@8@\@\\@\@8@\@\\@\@8@dZn`@A→'U¬$@`↓←dA[=eJACIOf~∀DV@\@8@\@\\@\@8@\@\\@\@8@\@d4nb@AM+¬$@DACeN4∀bVH8@\@\\@\@8@\@\\@\@8@\@\dZnpA'+¬H@bACIN~∀b4@\@\X@\@8@\@\\@\@8@\@\X@dZ\j@A'U¬$@b↓CeN~(bZH\X@\@8@\@\\@\@8@\@\\@\@HZnp@↓'+¬$bACe . . , . . . . , . . . . 2-69  SUBR 1 are
add1 . , & . . . , . . . . , 2-\d@AπU¬$@b↓CeN~)CYaQ¬YKgg@@\@\\@\@8@\@\X@\@HZjl@↓'#¬$α↓Iβπ⊗;L4+∞s⊃9↓r↓1↓9αq↓9↓p↓!↓→αq↓9↓r↓ ∩β%R3"αλj5,∃!Q&∂πYf"αd¬bαr¬dα`$HD¬HH¬dHEV.(λ	Jq0TDελ≠tD
9pY$<Y|aQX<≤
O+HD¬HH¬DHD¬HH¬DHDεK-`∧∧∪∀u(
Hλ@
}Hλh≡Yxc!<YkD¬HH¬DHD¬HH¬DHD¬HHε%,,H∧
u0TDε(_<Lq"X<L↑hH¬∧HD¬HH¬DHD¬HH¬∧K ≠P⊂&)Ua)⊂_H7y⊂→λ0y3yCE0y9_|W⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗\Zλ⊂#)jP)αE \90|qXv6↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εLX⊂⊂#∀ha)εB0q10↑r4vyK⊂↔⊂↔λ↔⊂↔⊂↔⊂↔λ↔⊂↔⊂⊗\ZPλ)ja)λ_P0y→FE0yXttW⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗L
P⊂)jP)⊂_@_y3FE_yywqK⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→Y≤⊂⊂∀ja)⊂⊂0y3\FE0y\xP↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗Y∞P⊂)jP)⊂→⊂_y3yFB0z0wλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗\_⊂λ)ja)λ→⊂0y→yFE0]7vP↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→⊗LP⊂⊂)Ua)⊂_H0y3FB10sxλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗XP⊂λ)ja)λ_P0y→FE17[v2W⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗L⊂⊂&)Ua)⊂→H7y⊂6[y2P0\3yFE_7zw2≤⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→ZXP⊂∀ja)⊂P0y3CE1ppXpy⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P0\3FEεBεE&p\1t⊂→K⊂_\[M∧DP⊂λ$dW$H⊂⊂#:[1z4w[⊂$w2→|∧DDH(0srH4FEβ∧DDPλ⊂⊂&pXv4yxλ)2s2\2w1rH&pw:XvεEεBεEεEβE1ppXr9⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P0\3FE1_ppy↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εL[⊂⊂)Ua)⊂_H0y3FB1ppr_y⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1pXr29⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗HM⊂⊂)jP)⊂_@_y3FE_ppr9⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0y3CE1pp\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P \3FE1Xr0pyλ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂→εLY⊂⊂)Ua)⊂_H0y3FB1pr0Y9⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1pY0y↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂→⊗HM⊂⊂)jP)⊂_P_y3FE_pr20\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0q3CE1pr→29⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P !rg
ca`db∞ . . , . . . . . . . . 2
12  SUBR 1 arg
cadr . . ( . . . . , . . . . 2-16  SUBR 1 are
car. ., . . . . , . . . . , 2-Dj@A'U¬$@bαβπK≤hS∂πS≡A9↓9αq↓9↓r↓1↓9αq↓9↓r↓9↓9β⊃5AQαα~NV∃⊂4+∂∂#↔;π&)↓9↓r↓1↓9αq↓9↓r↓1↓9αq↓I5CI↓α2≥*αI↓αβ?Iβn{K∃β∂∪↔L4T≠∪ππ∂⊃↓9↓r↓0∩αd¬bαr¬dαrαd¬bαrε &⊗Hλ∀jXTH$<Yc!,y_8,NHH¬@⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊗X[⊂λ)ja)λ_P0y→FE1r_py↔ , . . . .(∧@\@8@\@\P	↓Ihε∪ $λ∀u(*H ⊂_y3FE_p0r0\⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂→X[⊂⊂∀ja)⊂P0y3CE1r0Y29⊂↔λ↔⊂↔⊂⊂↔⊂↔λ↔⊂↔⊂⊂↔⊂↔λ→⊗X[λ⊂)ja∀⊂_P !rg
Cdadr∞ . . . . . . . , . . . 2-12  SUBR 1 arg
cdar . . , . . . . . . . . . 2-16  SUBR 1 arg
cddaar. . . . . , . . . . . 2-⊃6  SUBR 1 arg
cddadr . . . . . . . . . . . 2-16  SUBR 1 arg
cddar. . . . , . . . . . . . 2-16  SUBR 1 Arg
cdddar . . . . . . . . . . . 2
16  SUBR 1 arg
cddddr . . . . . . . . . . . 2-16  SUBR 1 arg
cdddr. . . . . . . . . . . . 2-16  SUBR 1 arg
cddr . . . . . . . . . . . . 2-16  SUBR 1 arg
cdr. . . . . . . . . . . . . 2-16  SUBR 1 arg
comment. . . . . . . . . . . 2-10  FSUBR
cond . . . . . . . . . . . . 2-36  FSUBR
cons . . . . . . . . . . . . 2-16  SUBR 2 args
copysymbol . . . . . . . . . 2-59  SUBR 2 args
cos. . . . . . . . . . . . . 2-80  SUBR 1 arg
cxr. . . . . . . . . . . . . 2-34  SUBR 2 args
defprop. . . . . . . . . . . 2-55  FSUBR
defun. . . . . . . . . . . . 2-61  FSUBR
delete . . . . . . . . . . . 2-26  LSUBR 2 or 3 args


Page ii			  II.I	 Function Index			 March 3, 1976
			  II.I	 Function Index




delq . . . . . . . . . . . . 2-27  LSUBR 2 or 3 args
difference . . . . . . . . . 2-71  LSUBR 1 or more args
do . . . . . . . . . . . . . 2-39  FSUBR
dumparrays . . . . . . . . . 2-97  SUBR 2 args
eq . . . . . . . . . . . . . 2-3   SUBR 2 args
equal. . . . . . . . . . . . 2-3   SUBR 2 args
err. . . . . . . . . . . . . 2-47  FSUBR
error. . . . . . . . . . . . 2-46  LSUBR 0 to 3 args
errset . . . . . . . . . . . 2-46  FSUBR
eval . . . . . . . . . . . . 2-7   LSUBR 1 or 2 args
exp. . . . . . . . . . . . . 2-79  SUBR 1 arg
explode. . . . . . . . . . . 2-87  SUBR 1 arg
explodec . . . . . . . . . . 2-87  SUBR 1 arg
exploden . . . . . . . . . . 2-87  SUBR 1 arg
expt . . . . . . . . . . . . 2-72  SUBR 2 args
fillarray. . . . . . . . . . 2-96  SUBR 2 args
fix. . . . . . . . . . . . . 2-69  SUBR 1 arg
fixp . . . . . . . . . . . . 2-1   SUBR 1 arg
flatc. . . . . . . . . . . . 2-88  SUBR 1 arg
fhatsize . . . . . . . . . . 2-87  SUBR 1 arg
float. . . . . . . . . . . . 2-69  SUBR 1 arg
floatp . . . . . . . . . . . 2-1   SUBR 1 arg
fsc. . . . . . . . . . . . . 2-84  SUBR 2 args
funcall. . . . . . . . . . . 2-13  LSUBR 1 or more args
function . . . . . . . . . . 2-8   FSUBR
gcd. . , . . . . . . . . . . 2-72  SUBR 2 args
gensym . . . . . . , . . . . 2-59  LSUBR 0 or 1 args
gat. , . . . . . . . . . , . 2-53  SUBR 2 args
getchar. . . . . . . . . . , 2-_5  SUBR 2 args
getcharn , . . . . , . . . . 2-86  SUBR 2 ardπf~∃≥KiX@8@\@\X@\@8@\@\\@\@8@\@dαiUM↓¬~V
Iβ⊃βπK?_4+∨/"␈C;∞k∃9↓r↓1↓9αq↓9↓r↓1↓9αq↓I5K↓↓αN,∩I↓E∧∧↔⊗8Q(vzαd¬bαr¬dαbαd¬bαr¬dαbαd¬bαrε &FHλ⊃J:0TC!,|Y8.L<Xλ¬DHD¬H@¬@⊂∪⊂↔λ↔⊂↔⊂⊗[≠Pλ&)ba∀⊂→⊂ /p∧A[←β∪∃βε⊗;L4+F'Cεα.Bbαd¬bαr¬dα`$	HD¬HH¬∧K ≠L⊂⊂!jP)⊂↓ args
λhae@1←]N\X@\@8@\@\X@\@8@\@\dZllA'+¬H@bACIJ~∃QU]V@\P	↓9αq↓9↓r↓1↓9αq↓9↓p↓1↓Ihε3~α	J5,∃$εαε␈$	V␈⊗T↔⊗?1Q&G.βZ|¬DHD¬HH¬D	HD¬HH¬@⊂↔⊂→Y⊂⊂⊂∀ja)⊂P0a3CE0	fix & . . . , . . . .( . . 2-69  SEBR 1 @¬eN~∃![aY←⊃JT@\P	↓→αq↓9↓p↓ ∩αd¬bαrε 'εHλ∀jXTH$<Yc!↓"C"I\<Xr∧εi'⊗iB"∧∧λ∩2%I(λλλn9Pu
≥{H∩-l→>α!∀λλλ∧∧λ⊂⊂,\(~ ∀ZFEα∧DDPλ⊂⊂&pXv4qhλ)2s %p¬KMεα)α7πw+π04Ph (!Q h↓X∧w2→rgs
intern . . . . . . . . . . . 2-59  SUBR 1 arg
last . . . . . . . . . . . . 2-18  SUBR 1 arg
length . . . . . . . . . . . 2-18  SUBR 1 arg
lessp. . . . . . . . . . . . 2-67  LSUBR 2 or more args
list . . . . . . . . . . . . 2-19  LSUBR 0 or more args
listarray. . . . . . . . . . 2-96  LSUBR 1 or 2 args
listify. . . . . . . . . . . 2-13  SUBR 1 arg
loadarrays . . . . . . . . . 2-97  SUBR 1 arg
log. . . . . . . . . . . . . 2-79  SUBR 1 arg
lsh. . . . . . . . . . . . . 2-83  SUBR 2 args
lsubrcall. . . . . . . . . . 2-14  FSUBR
make←atom. . . . . . . . . . 2-90  SUBR 1 arg
makhunk. . . . . . . . . . . 2-34  SUBR 1 arg
maknam . . . . . . . . . . . 2-86  SUBR 1 arg
maknum . . . . . . . . . . . 2-30  SUBR 1 arg
makunbound . . . . . . . . . 2-51  SUBR 1 arg
map. . . . . . . . . . . . . 2-101 LSUBR 2 or more args
mapatoms . . . . . . . . . . 2-99  LSUBR 1 or 2 args
mapc . . . . . . . . . . . . 2-99  LSUBR 2 or more args
mapcan . . . . . . . . . . . 2-99  LSUBR 2 or more args
mapcar . . . . . . . . . . . 2-99  LSUBR 2 or more args
mapcon . . . . . . . . . . . 2-99  LSUBR 2 or more args
maplist. . . . . . . . . . . 2-99  LSUBR 2 or more args
max. . . . . . . . . . . . . 2-68  LSUBR 1 or more args
member . . . . . . . . . . . 2-25  SUBR 2 args
memq . . . . . . . . . . . . 2-26  SUBR 2 args
min. . . . . . . . . . . . . 2-68  LSUBR 1 or more args
minus. . . . . . . . . . . . 2-70  SUBR 1 arg
minusp . . . . . . . . . . . 2-65  SUBR 1 arg
munkam . . . . . . . . . . . 2-30  SUBR 1 arg
nconc. . . . . . . . . . . . 2-20  LSUBR 0 or more args
ncons. . . . . . . . . . . . 2-17  SUBR 1 arg
not. . . . . . . . . . . . . 2-4   SUBR 1 arg
nreconc. . . . . . . . . . . 2-21  SUBR 2 args
nreverse . . . . . . . . . . 2-21  SUBR 1 arg
null . . . . . . . . . . . . 2-4   SUBR 1 arg
numberp. . . . . . . . . . . 2-2   SUBR 1 arg
oddp . . . . . . . . . . . . 2-65  SUBR 1 arg
or . . . . . . . . . . . . . 2-36  FSUBR


Page iv			  II.I	 Function Index			 March 3, 1976
			  II.I	 Function Index




plist. . . . . . . . . . . . 2-55  SUBR 1 arg
plus . . . . . . . . . . . . 2-71  LSUBR 0 or more args
plusp. . . . . . . . . . . . 2-65  SUBR 1 arg
pnget. . . . . . . . . . . . 2-57  SUBR 2 args
pnput. . . . . . . . . . . . 2-57  SUBR 2 args
prog . . . . . . . . . . . . 2-38  FSUBR
prog2. . . . . . . . . . . . 2-10  LSUBR 2 or more args
progn. . . . . . . . . . . . 2-11  LSUBR 1 or more args
progv. . . . . . . . . . . . 2-11  FSUBR
putprop. . . . . . . . . . . 2-54  SUBR 3 args
quote. . . . . . . . . . . . 2-7   FSUBR
quotient . . . . . . . . . . 2-71  LSUBR 1 or more args
random . . . . . . . . . . . 2-81  LSUBR 0 to 2 args
readlist . . . . . . . . . . 2-86  SUBR 1 arg
remainder. . . . . . . . . . 2-72  SUBR 2 args
remob. . . . . . . . . . . . 2-59  SUBR 1 arg
remprop. . . . . . . . . . . 2-55  SUBR 2 args
return . . . . . . . . . . . 2-43  SUBR 1 arg
reverse. . . . . . . . . . . 2-20  SUBR 1 arg
rot. . . . . . . . . . . . . 2-83  SUBR 2 args
rplaca . . . . . . . . . . . 2-23  SUBR 2 args
rplacd . . . . . . . . . . . 2-23  SUBR 2 args
samepnamep . . . . . . . . . 2-56  SUBR 2 args
sassoc . . . . . . . . . . . 2-29  SUBR 3 args
sassq. . . . . . . . . . . . 2-30  SUBR 3 args
set. . . . . . . . . . . . . 2-50  SUBR 2 args
setarg . . . . . . . . . . . 2-12  SUBR 2 args
setplist . . . . . . . . . . 2-55  SUBR 2 args
setq . . . . . . . . . . . . 2-49  FSUBR
signp. . . . . . . . . . . . 2-66  FSUBR
sin. . . . . . . . . . . . . 2-80  SUBR 1 arg
sort . . . . . . . . . . . . 2-31  SUBR 2 args
sortcar. . . . . . . . . . . 2-32  SUBR 2 args
sqrt . . . . . . . . . . . . 2-79  SUBR 1 arg
store. . . . . . . . . . . . 2-95  FSUBR
stringlength . . . . . . . . 2-89  SUBR 1 arg
stringp. . . . . . . . . . . 2-2   SUBR 1 arg
sub1 . . . . . . . . . . . . 2-72  SUBR 1 arg
sublis . . . . . . . . . . . 2-24  SUBR 2 args
subrcall . . . . . . . . . . 2-13  FSUBR


March 3, 1976		  II.I	 Function Index				Page v
			    Maclisp Reference Manual




subrp. . . . . . . . . . . . 2-2   SUBR 1 arg
subst. . . . . . . . . . . . 2-24  SUBR 3 args
substr . . . . . . . . . . . 2-90  LSUBR 2 or 3 args
sxhash . . . . . . . . . . . 2-27  SUBR 1 arg
symbolp. . . . . . . . . . . 2-1   SUBR 1 arg
symeval. . . . . . . . . . . 2-50  SUBR 1 arg
sysp . . . . . . . . . . . . 2-63  SUBR 1 arg
throw. . . . . . . . . . . . 2-45  FSUBR
times. . . . . . . . . . . . 2-71  LSUBR 0 or more args
typep. . . . . . . . . . . . 2-2   SUBR 1 arg
xcons. . . . . , . . . . . . 2-17  SUBR 2 args
zerop. , . . . . . . . . . . 2-65  SUBR 1 arg
\. . . . . . . . . . . . . . 2-75  SUBR 2 args
\\ . . . . . . . . . . . . . 2-75  SUBR 2 args
↑. . . . . . . . . . . . . . 2-76  SUBR 2 args
↑$ . . . . . . . . . . . . . 2-78  SUBR 2 args
































Page vi			  II.I	 Function Index			 March 3, 1976
			    Maclisp Reference Manual


			  II.II    Atom Index


array. . . . . . . . . . . . 2-2
bignum . . . . . . . . . . . 2-2
car. . . . . . . . . . . . . 2-15
cdr. . . . . . . . . . . . . 2-15
defun. . . . . . . . . . . . 2-61
fixnum . . . . . . . . . . . 2-2
flonum . . . . . . . . . . . 2-2
funarg . . . . . . . . . . . 2-9
hunkp. . . . . . . . . . . . 2-34
list . . . . . . . . . . . . 2-2
nil. . . . . . . . . . . . . 1-10
random . . . . . . . . . . . 2-2
string . . . . . . . . . . . 2-2
symbol . . . . . . . . . . . 2-2
zunderflow . . . . . . . . . 2-81



























Page vii		   II.II   Atom Index			 March 3, 1976
			    Maclisp Reference Manual


			 II.III    Concept Index


application. . . . . . . . . 1-17	 lambda . . . . . . . . . . . 1-17
argument . . . . . . . . . . 1-15	 lambda variable. . . . . . . 1-17
arithmetic . . . . . . . . . 2-71	 lexpr. . . . . . . . . . . . 1-16
array. . . . . . . . . . . . 1-9	 list . . . . . . . . . . . . 1-10
association list . . . . . . 2-25	 looping. . . . . . . . . . . 2-35
atom . . . . . . . . . . . . 1-7	 lsubr. . . . . . . . . . . . 1-15
atomic symbol. . . . . . . . 1-8	 macro. . . . . . . . . . . . 1-16
bignum . . . . . . . . . . . 1-7	 mapping. . . . . . . . . . . 2-99
binding. . . . . . . . . . . 1-13	 mathematical functions . . . 2-79
binding context pointer. . . 1-24	 nil. . . . . . . . . . . . . 1-8
boolean operations . . . . . 2-82	 non-local exit . . . . . . . 2-35
car. . . . . . . . . . . . . 1-9	 number . . . . . . . . . . . 1-7
cdr. . . . . . . . . . . . . 1-9	 obarray. . . . . . . . . . . 2-58
character manipulation . . . 2-85	 object . . . . . . . . . . . 1-7
character object . . . . . . 1-8	 pname. . . . . . . . . . . . 2-56
comment. . . . . . . . . . . 2-10	 predicate. . . . . . . . . . 2-1
cons . . . . . . . . . . . . 1-9	 property . . . . . . . . . . 2-52
defining functions . . . . . 2-61	 property list. . . . . . . . 2-52
dot. . . . . . . . . . . . . 1-10	 quote. . . . . . . . . . . . 2-7
dotted pair. . . . . . . . . 1-10	 recursion. . . . . . . . . . 2-35
eq versus equal. . . . . . . 2-3	 S-expression . . . . . . . . 1-7
errors . . . . . . . . . . . 2-35	 sorting. . . . . . . . . . . 2-31
evaluation . . . . . . . . . 1-15	 special forms. . . . . . . . 1-21
expr . . . . . . . . . . . . 1-15	 string . . . . . . . . . . . 1-9
fexpr. . . . . . . . . . . . 1-15	 subr . . . . . . . . . . . . 1-15
fixnum . . . . . . . . . . . 1-7	 subr-object. . . . . . . . . 1-9
flonum . . . . . . . . . . . 1-7	 substitution . . . . . . . . 2-23
flow of control. . . . . . . 2-35	 symbol . . . . . . . . . . . 1-8
form . . . . . . . . . . . . 1-15	 t. . . . . . . . . . . . . . 1-8
fsubr. . . . . . . . . . . . 1-15	 value cell . . . . . . . . . 2-49
funarg . . . . . . . . . . . 1-20
funarg problem . . . . . . . 2-8
function . . . . . . . . . . 1-15
functional property. . . . . 1-17
gensym . . . . . . . . . . . 2-59
hash table . . . . . . . . . 2-25
indicator. . . . . . . . . . 2-52
intern . . . . . . . . . . . 2-58
iteration. . . . . . . . . . 2-35
label. . . . . . . . . . . . 1-20

Page viii		II.III	 Concept Index			 March 3, 1976